diff --git a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
index b2b08b0..db139e1 100644
--- a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
+++ b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.acceleratedmobilepageurl.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/acceleratedmobilepageurl/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -97,14 +96,14 @@
   buildCounterAmpUrlError--;
 }
 
-buildUnnamed1258() {
+buildUnnamed1254() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1258(core.List<core.String> o) {
+checkUnnamed1254(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -116,7 +115,7 @@
   buildCounterBatchGetAmpUrlsRequest++;
   if (buildCounterBatchGetAmpUrlsRequest < 3) {
     o.lookupStrategy = "foo";
-    o.urls = buildUnnamed1258();
+    o.urls = buildUnnamed1254();
   }
   buildCounterBatchGetAmpUrlsRequest--;
   return o;
@@ -126,32 +125,32 @@
   buildCounterBatchGetAmpUrlsRequest++;
   if (buildCounterBatchGetAmpUrlsRequest < 3) {
     unittest.expect(o.lookupStrategy, unittest.equals('foo'));
-    checkUnnamed1258(o.urls);
+    checkUnnamed1254(o.urls);
   }
   buildCounterBatchGetAmpUrlsRequest--;
 }
 
-buildUnnamed1259() {
+buildUnnamed1255() {
   var o = new core.List<api.AmpUrl>();
   o.add(buildAmpUrl());
   o.add(buildAmpUrl());
   return o;
 }
 
-checkUnnamed1259(core.List<api.AmpUrl> o) {
+checkUnnamed1255(core.List<api.AmpUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAmpUrl(o[0]);
   checkAmpUrl(o[1]);
 }
 
-buildUnnamed1260() {
+buildUnnamed1256() {
   var o = new core.List<api.AmpUrlError>();
   o.add(buildAmpUrlError());
   o.add(buildAmpUrlError());
   return o;
 }
 
-checkUnnamed1260(core.List<api.AmpUrlError> o) {
+checkUnnamed1256(core.List<api.AmpUrlError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAmpUrlError(o[0]);
   checkAmpUrlError(o[1]);
@@ -162,8 +161,8 @@
   var o = new api.BatchGetAmpUrlsResponse();
   buildCounterBatchGetAmpUrlsResponse++;
   if (buildCounterBatchGetAmpUrlsResponse < 3) {
-    o.ampUrls = buildUnnamed1259();
-    o.urlErrors = buildUnnamed1260();
+    o.ampUrls = buildUnnamed1255();
+    o.urlErrors = buildUnnamed1256();
   }
   buildCounterBatchGetAmpUrlsResponse--;
   return o;
@@ -172,13 +171,12 @@
 checkBatchGetAmpUrlsResponse(api.BatchGetAmpUrlsResponse o) {
   buildCounterBatchGetAmpUrlsResponse++;
   if (buildCounterBatchGetAmpUrlsResponse < 3) {
-    checkUnnamed1259(o.ampUrls);
-    checkUnnamed1260(o.urlErrors);
+    checkUnnamed1255(o.ampUrls);
+    checkUnnamed1256(o.urlErrors);
   }
   buildCounterBatchGetAmpUrlsResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-AmpUrl", () {
     unittest.test("to-json--from-json", () {
@@ -188,7 +186,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AmpUrlError", () {
     unittest.test("to-json--from-json", () {
       var o = buildAmpUrlError();
@@ -197,7 +194,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchGetAmpUrlsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchGetAmpUrlsRequest();
@@ -206,7 +202,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchGetAmpUrlsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchGetAmpUrlsResponse();
@@ -215,12 +210,11 @@
     });
   });
 
-
   unittest.group("resource-AmpUrlsResourceApi", () {
     unittest.test("method--batchGet", () {
-
       var mock = new HttpServerMock();
-      api.AmpUrlsResourceApi res = new api.AcceleratedmobilepageurlApi(mock).ampUrls;
+      api.AmpUrlsResourceApi res =
+          new api.AcceleratedmobilepageurlApi(mock).ampUrls;
       var arg_request = buildBatchGetAmpUrlsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.BatchGetAmpUrlsRequest.fromJson(json);
@@ -230,9 +224,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("v1/ampUrls:batchGet"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("v1/ampUrls:batchGet"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -245,27 +241,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBatchGetAmpUrlsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.batchGet(arg_request).then(unittest.expectAsync1(((api.BatchGetAmpUrlsResponse response) {
+      res
+          .batchGet(arg_request)
+          .then(unittest.expectAsync1(((api.BatchGetAmpUrlsResponse response) {
         checkBatchGetAmpUrlsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/adexperiencereport/v1_test.dart b/generated/googleapis/test/adexperiencereport/v1_test.dart
index c5444d2..3bf39a2 100644
--- a/generated/googleapis/test/adexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/adexperiencereport/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.adexperiencereport.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/adexperiencereport/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1774() {
+buildUnnamed1772() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1774(core.List<core.String> o) {
+checkUnnamed1772(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -74,7 +73,7 @@
     o.enforcementTime = "foo";
     o.filterStatus = "foo";
     o.lastChangeTime = "foo";
-    o.region = buildUnnamed1774();
+    o.region = buildUnnamed1772();
     o.reportUrl = "foo";
     o.underReview = true;
   }
@@ -90,7 +89,7 @@
     unittest.expect(o.enforcementTime, unittest.equals('foo'));
     unittest.expect(o.filterStatus, unittest.equals('foo'));
     unittest.expect(o.lastChangeTime, unittest.equals('foo'));
-    checkUnnamed1774(o.region);
+    checkUnnamed1772(o.region);
     unittest.expect(o.reportUrl, unittest.equals('foo'));
     unittest.expect(o.underReview, unittest.isTrue);
   }
@@ -120,14 +119,14 @@
   buildCounterSiteSummaryResponse--;
 }
 
-buildUnnamed1775() {
+buildUnnamed1773() {
   var o = new core.List<api.SiteSummaryResponse>();
   o.add(buildSiteSummaryResponse());
   o.add(buildSiteSummaryResponse());
   return o;
 }
 
-checkUnnamed1775(core.List<api.SiteSummaryResponse> o) {
+checkUnnamed1773(core.List<api.SiteSummaryResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteSummaryResponse(o[0]);
   checkSiteSummaryResponse(o[1]);
@@ -138,7 +137,7 @@
   var o = new api.ViolatingSitesResponse();
   buildCounterViolatingSitesResponse++;
   if (buildCounterViolatingSitesResponse < 3) {
-    o.violatingSites = buildUnnamed1775();
+    o.violatingSites = buildUnnamed1773();
   }
   buildCounterViolatingSitesResponse--;
   return o;
@@ -147,12 +146,11 @@
 checkViolatingSitesResponse(api.ViolatingSitesResponse o) {
   buildCounterViolatingSitesResponse++;
   if (buildCounterViolatingSitesResponse < 3) {
-    checkUnnamed1775(o.violatingSites);
+    checkUnnamed1773(o.violatingSites);
   }
   buildCounterViolatingSitesResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-PlatformSummary", () {
     unittest.test("to-json--from-json", () {
@@ -162,7 +160,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SiteSummaryResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteSummaryResponse();
@@ -171,7 +168,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ViolatingSitesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildViolatingSitesResponse();
@@ -180,10 +176,8 @@
     });
   });
 
-
   unittest.group("resource-SitesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SitesResourceApi res = new api.AdexperiencereportApi(mock).sites;
       var arg_name = "foo";
@@ -192,9 +186,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -208,41 +204,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSiteSummaryResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.SiteSummaryResponse response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.SiteSummaryResponse response) {
         checkSiteSummaryResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ViolatingSitesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ViolatingSitesResourceApi res = new api.AdexperiencereportApi(mock).violatingSites;
+      api.ViolatingSitesResourceApi res =
+          new api.AdexperiencereportApi(mock).violatingSites;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/violatingSites"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/violatingSites"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -255,27 +254,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildViolatingSitesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list().then(unittest.expectAsync1(((api.ViolatingSitesResponse response) {
+      res
+          .list()
+          .then(unittest.expectAsync1(((api.ViolatingSitesResponse response) {
         checkViolatingSitesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/admin/datatransfer_v1_test.dart b/generated/googleapis/test/admin/datatransfer_v1_test.dart
index 516d98f..bb531b9 100644
--- a/generated/googleapis/test/admin/datatransfer_v1_test.dart
+++ b/generated/googleapis/test/admin/datatransfer_v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.admin.datatransfer_v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/admin/datatransfer_v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed168() {
+buildUnnamed163() {
   var o = new core.List<api.ApplicationTransferParam>();
   o.add(buildApplicationTransferParam());
   o.add(buildApplicationTransferParam());
   return o;
 }
 
-checkUnnamed168(core.List<api.ApplicationTransferParam> o) {
+checkUnnamed163(core.List<api.ApplicationTransferParam> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationTransferParam(o[0]);
   checkApplicationTransferParam(o[1]);
@@ -73,7 +72,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.transferParams = buildUnnamed168();
+    o.transferParams = buildUnnamed163();
   }
   buildCounterApplication--;
   return o;
@@ -86,19 +85,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed168(o.transferParams);
+    checkUnnamed163(o.transferParams);
   }
   buildCounterApplication--;
 }
 
-buildUnnamed169() {
+buildUnnamed164() {
   var o = new core.List<api.ApplicationTransferParam>();
   o.add(buildApplicationTransferParam());
   o.add(buildApplicationTransferParam());
   return o;
 }
 
-checkUnnamed169(core.List<api.ApplicationTransferParam> o) {
+checkUnnamed164(core.List<api.ApplicationTransferParam> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationTransferParam(o[0]);
   checkApplicationTransferParam(o[1]);
@@ -110,7 +109,7 @@
   buildCounterApplicationDataTransfer++;
   if (buildCounterApplicationDataTransfer < 3) {
     o.applicationId = "foo";
-    o.applicationTransferParams = buildUnnamed169();
+    o.applicationTransferParams = buildUnnamed164();
     o.applicationTransferStatus = "foo";
   }
   buildCounterApplicationDataTransfer--;
@@ -121,20 +120,20 @@
   buildCounterApplicationDataTransfer++;
   if (buildCounterApplicationDataTransfer < 3) {
     unittest.expect(o.applicationId, unittest.equals('foo'));
-    checkUnnamed169(o.applicationTransferParams);
+    checkUnnamed164(o.applicationTransferParams);
     unittest.expect(o.applicationTransferStatus, unittest.equals('foo'));
   }
   buildCounterApplicationDataTransfer--;
 }
 
-buildUnnamed170() {
+buildUnnamed165() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed170(core.List<core.String> o) {
+checkUnnamed165(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -146,7 +145,7 @@
   buildCounterApplicationTransferParam++;
   if (buildCounterApplicationTransferParam < 3) {
     o.key = "foo";
-    o.value = buildUnnamed170();
+    o.value = buildUnnamed165();
   }
   buildCounterApplicationTransferParam--;
   return o;
@@ -156,19 +155,19 @@
   buildCounterApplicationTransferParam++;
   if (buildCounterApplicationTransferParam < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed170(o.value);
+    checkUnnamed165(o.value);
   }
   buildCounterApplicationTransferParam--;
 }
 
-buildUnnamed171() {
+buildUnnamed166() {
   var o = new core.List<api.Application>();
   o.add(buildApplication());
   o.add(buildApplication());
   return o;
 }
 
-checkUnnamed171(core.List<api.Application> o) {
+checkUnnamed166(core.List<api.Application> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplication(o[0]);
   checkApplication(o[1]);
@@ -179,7 +178,7 @@
   var o = new api.ApplicationsListResponse();
   buildCounterApplicationsListResponse++;
   if (buildCounterApplicationsListResponse < 3) {
-    o.applications = buildUnnamed171();
+    o.applications = buildUnnamed166();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -191,7 +190,7 @@
 checkApplicationsListResponse(api.ApplicationsListResponse o) {
   buildCounterApplicationsListResponse++;
   if (buildCounterApplicationsListResponse < 3) {
-    checkUnnamed171(o.applications);
+    checkUnnamed166(o.applications);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -199,14 +198,14 @@
   buildCounterApplicationsListResponse--;
 }
 
-buildUnnamed172() {
+buildUnnamed167() {
   var o = new core.List<api.ApplicationDataTransfer>();
   o.add(buildApplicationDataTransfer());
   o.add(buildApplicationDataTransfer());
   return o;
 }
 
-checkUnnamed172(core.List<api.ApplicationDataTransfer> o) {
+checkUnnamed167(core.List<api.ApplicationDataTransfer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationDataTransfer(o[0]);
   checkApplicationDataTransfer(o[1]);
@@ -217,7 +216,7 @@
   var o = new api.DataTransfer();
   buildCounterDataTransfer++;
   if (buildCounterDataTransfer < 3) {
-    o.applicationDataTransfers = buildUnnamed172();
+    o.applicationDataTransfers = buildUnnamed167();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -233,26 +232,27 @@
 checkDataTransfer(api.DataTransfer o) {
   buildCounterDataTransfer++;
   if (buildCounterDataTransfer < 3) {
-    checkUnnamed172(o.applicationDataTransfers);
+    checkUnnamed167(o.applicationDataTransfers);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.newOwnerUserId, unittest.equals('foo'));
     unittest.expect(o.oldOwnerUserId, unittest.equals('foo'));
     unittest.expect(o.overallTransferStatusCode, unittest.equals('foo'));
-    unittest.expect(o.requestTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.requestTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterDataTransfer--;
 }
 
-buildUnnamed173() {
+buildUnnamed168() {
   var o = new core.List<api.DataTransfer>();
   o.add(buildDataTransfer());
   o.add(buildDataTransfer());
   return o;
 }
 
-checkUnnamed173(core.List<api.DataTransfer> o) {
+checkUnnamed168(core.List<api.DataTransfer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataTransfer(o[0]);
   checkDataTransfer(o[1]);
@@ -263,7 +263,7 @@
   var o = new api.DataTransfersListResponse();
   buildCounterDataTransfersListResponse++;
   if (buildCounterDataTransfersListResponse < 3) {
-    o.dataTransfers = buildUnnamed173();
+    o.dataTransfers = buildUnnamed168();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -275,7 +275,7 @@
 checkDataTransfersListResponse(api.DataTransfersListResponse o) {
   buildCounterDataTransfersListResponse++;
   if (buildCounterDataTransfersListResponse < 3) {
-    checkUnnamed173(o.dataTransfers);
+    checkUnnamed168(o.dataTransfers);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -283,7 +283,6 @@
   buildCounterDataTransfersListResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-Application", () {
     unittest.test("to-json--from-json", () {
@@ -293,7 +292,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationDataTransfer", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationDataTransfer();
@@ -302,7 +300,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationTransferParam", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationTransferParam();
@@ -311,7 +308,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationsListResponse();
@@ -320,7 +316,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DataTransfer", () {
     unittest.test("to-json--from-json", () {
       var o = buildDataTransfer();
@@ -329,7 +324,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DataTransfersListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDataTransfersListResponse();
@@ -338,10 +332,8 @@
     });
   });
 
-
   unittest.group("resource-ApplicationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ApplicationsResourceApi res = new api.AdminApi(mock).applications;
       var arg_applicationId = "foo";
@@ -350,11 +342,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("admin/datatransfer/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("admin/datatransfer/v1/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -370,27 +365,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApplication());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_applicationId).then(unittest.expectAsync1(((api.Application response) {
+      res
+          .get(arg_applicationId)
+          .then(unittest.expectAsync1(((api.Application response) {
         checkApplication(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ApplicationsResourceApi res = new api.AdminApi(mock).applications;
       var arg_customerId = "foo";
@@ -401,11 +398,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("admin/datatransfer/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("admin/datatransfer/v1/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("applications"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("applications"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -418,34 +418,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApplicationsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(customerId: arg_customerId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ApplicationsListResponse response) {
+      res
+          .list(
+              customerId: arg_customerId,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ApplicationsListResponse response) {
         checkApplicationsListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TransfersResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TransfersResourceApi res = new api.AdminApi(mock).transfers;
       var arg_dataTransferId = "foo";
@@ -454,11 +460,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("admin/datatransfer/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("admin/datatransfer/v1/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("transfers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("transfers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -474,27 +483,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataTransfer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_dataTransferId).then(unittest.expectAsync1(((api.DataTransfer response) {
+      res
+          .get(arg_dataTransferId)
+          .then(unittest.expectAsync1(((api.DataTransfer response) {
         checkDataTransfer(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TransfersResourceApi res = new api.AdminApi(mock).transfers;
       var arg_request = buildDataTransfer();
@@ -506,11 +517,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("admin/datatransfer/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("admin/datatransfer/v1/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("transfers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("transfers"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -523,27 +537,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataTransfer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.DataTransfer response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.DataTransfer response) {
         checkDataTransfer(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TransfersResourceApi res = new api.AdminApi(mock).transfers;
       var arg_customerId = "foo";
@@ -557,11 +573,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("admin/datatransfer/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("admin/datatransfer/v1/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("transfers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("transfers"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -574,33 +593,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["newOwnerUserId"].first, unittest.equals(arg_newOwnerUserId));
-        unittest.expect(queryMap["oldOwnerUserId"].first, unittest.equals(arg_oldOwnerUserId));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(queryMap["newOwnerUserId"].first,
+            unittest.equals(arg_newOwnerUserId));
+        unittest.expect(queryMap["oldOwnerUserId"].first,
+            unittest.equals(arg_oldOwnerUserId));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["status"].first, unittest.equals(arg_status));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataTransfersListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(customerId: arg_customerId, maxResults: arg_maxResults, newOwnerUserId: arg_newOwnerUserId, oldOwnerUserId: arg_oldOwnerUserId, pageToken: arg_pageToken, status: arg_status).then(unittest.expectAsync1(((api.DataTransfersListResponse response) {
+      res
+          .list(
+              customerId: arg_customerId,
+              maxResults: arg_maxResults,
+              newOwnerUserId: arg_newOwnerUserId,
+              oldOwnerUserId: arg_oldOwnerUserId,
+              pageToken: arg_pageToken,
+              status: arg_status)
+          .then(
+              unittest.expectAsync1(((api.DataTransfersListResponse response) {
         checkDataTransfersListResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index f578689..0f87a73 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.admin.directory_v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/admin/directory_v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -78,17 +77,33 @@
   buildCounterAlias--;
 }
 
-buildUnnamed805() {
+buildUnnamed808() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed805(core.List<core.Object> o) {
+checkUnnamed808(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterAliases = 0;
@@ -96,7 +111,7 @@
   var o = new api.Aliases();
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    o.aliases = buildUnnamed805();
+    o.aliases = buildUnnamed808();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -107,7 +122,7 @@
 checkAliases(api.Aliases o) {
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    checkUnnamed805(o.aliases);
+    checkUnnamed808(o.aliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -145,14 +160,14 @@
   buildCounterAsp--;
 }
 
-buildUnnamed806() {
+buildUnnamed809() {
   var o = new core.List<api.Asp>();
   o.add(buildAsp());
   o.add(buildAsp());
   return o;
 }
 
-checkUnnamed806(core.List<api.Asp> o) {
+checkUnnamed809(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsp(o[0]);
   checkAsp(o[1]);
@@ -164,7 +179,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed806();
+    o.items = buildUnnamed809();
     o.kind = "foo";
   }
   buildCounterAsps--;
@@ -175,7 +190,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed806(o.items);
+    checkUnnamed809(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAsps--;
@@ -212,14 +227,14 @@
   buildCounterCalendarResource--;
 }
 
-buildUnnamed807() {
+buildUnnamed810() {
   var o = new core.List<api.CalendarResource>();
   o.add(buildCalendarResource());
   o.add(buildCalendarResource());
   return o;
 }
 
-checkUnnamed807(core.List<api.CalendarResource> o) {
+checkUnnamed810(core.List<api.CalendarResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarResource(o[0]);
   checkCalendarResource(o[1]);
@@ -231,7 +246,7 @@
   buildCounterCalendarResources++;
   if (buildCounterCalendarResources < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed807();
+    o.items = buildUnnamed810();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -243,21 +258,21 @@
   buildCounterCalendarResources++;
   if (buildCounterCalendarResources < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed807(o.items);
+    checkUnnamed810(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCalendarResources--;
 }
 
-buildUnnamed808() {
+buildUnnamed811() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed808(core.Map<core.String, core.String> o) {
+checkUnnamed811(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -272,7 +287,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed808();
+    o.params = buildUnnamed811();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -290,7 +305,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed808(o.params);
+    checkUnnamed811(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -316,19 +331,20 @@
   buildCounterChromeOsDeviceActiveTimeRanges++;
   if (buildCounterChromeOsDeviceActiveTimeRanges < 3) {
     unittest.expect(o.activeTime, unittest.equals(42));
-    unittest.expect(o.date, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
+    unittest.expect(
+        o.date, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
   buildCounterChromeOsDeviceActiveTimeRanges--;
 }
 
-buildUnnamed809() {
+buildUnnamed812() {
   var o = new core.List<api.ChromeOsDeviceActiveTimeRanges>();
   o.add(buildChromeOsDeviceActiveTimeRanges());
   o.add(buildChromeOsDeviceActiveTimeRanges());
   return o;
 }
 
-checkUnnamed809(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
+checkUnnamed812(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceActiveTimeRanges(o[0]);
   checkChromeOsDeviceActiveTimeRanges(o[1]);
@@ -355,14 +371,14 @@
   buildCounterChromeOsDeviceRecentUsers--;
 }
 
-buildUnnamed810() {
+buildUnnamed813() {
   var o = new core.List<api.ChromeOsDeviceRecentUsers>();
   o.add(buildChromeOsDeviceRecentUsers());
   o.add(buildChromeOsDeviceRecentUsers());
   return o;
 }
 
-checkUnnamed810(core.List<api.ChromeOsDeviceRecentUsers> o) {
+checkUnnamed813(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceRecentUsers(o[0]);
   checkChromeOsDeviceRecentUsers(o[1]);
@@ -373,7 +389,7 @@
   var o = new api.ChromeOsDevice();
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    o.activeTimeRanges = buildUnnamed809();
+    o.activeTimeRanges = buildUnnamed812();
     o.annotatedAssetId = "foo";
     o.annotatedLocation = "foo";
     o.annotatedUser = "foo";
@@ -393,7 +409,7 @@
     o.orgUnitPath = "foo";
     o.osVersion = "foo";
     o.platformVersion = "foo";
-    o.recentUsers = buildUnnamed810();
+    o.recentUsers = buildUnnamed813();
     o.serialNumber = "foo";
     o.status = "foo";
     o.supportEndDate = core.DateTime.parse("2002-02-27T14:01:02");
@@ -406,7 +422,7 @@
 checkChromeOsDevice(api.ChromeOsDevice o) {
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    checkUnnamed809(o.activeTimeRanges);
+    checkUnnamed812(o.activeTimeRanges);
     unittest.expect(o.annotatedAssetId, unittest.equals('foo'));
     unittest.expect(o.annotatedLocation, unittest.equals('foo'));
     unittest.expect(o.annotatedUser, unittest.equals('foo'));
@@ -416,8 +432,10 @@
     unittest.expect(o.ethernetMacAddress, unittest.equals('foo'));
     unittest.expect(o.firmwareVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.lastEnrollmentTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.lastSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastEnrollmentTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastSync,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.macAddress, unittest.equals('foo'));
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
@@ -426,10 +444,11 @@
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     unittest.expect(o.osVersion, unittest.equals('foo'));
     unittest.expect(o.platformVersion, unittest.equals('foo'));
-    checkUnnamed810(o.recentUsers);
+    checkUnnamed813(o.recentUsers);
     unittest.expect(o.serialNumber, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    unittest.expect(o.supportEndDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.supportEndDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.willAutoRenew, unittest.isTrue);
   }
   buildCounterChromeOsDevice--;
@@ -456,14 +475,14 @@
   buildCounterChromeOsDeviceAction--;
 }
 
-buildUnnamed811() {
+buildUnnamed814() {
   var o = new core.List<api.ChromeOsDevice>();
   o.add(buildChromeOsDevice());
   o.add(buildChromeOsDevice());
   return o;
 }
 
-checkUnnamed811(core.List<api.ChromeOsDevice> o) {
+checkUnnamed814(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDevice(o[0]);
   checkChromeOsDevice(o[1]);
@@ -474,7 +493,7 @@
   var o = new api.ChromeOsDevices();
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    o.chromeosdevices = buildUnnamed811();
+    o.chromeosdevices = buildUnnamed814();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -486,7 +505,7 @@
 checkChromeOsDevices(api.ChromeOsDevices o) {
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    checkUnnamed811(o.chromeosdevices);
+    checkUnnamed814(o.chromeosdevices);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -494,14 +513,14 @@
   buildCounterChromeOsDevices--;
 }
 
-buildUnnamed812() {
+buildUnnamed815() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed812(core.List<core.String> o) {
+checkUnnamed815(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -512,7 +531,7 @@
   var o = new api.ChromeOsMoveDevicesToOu();
   buildCounterChromeOsMoveDevicesToOu++;
   if (buildCounterChromeOsMoveDevicesToOu < 3) {
-    o.deviceIds = buildUnnamed812();
+    o.deviceIds = buildUnnamed815();
   }
   buildCounterChromeOsMoveDevicesToOu--;
   return o;
@@ -521,7 +540,7 @@
 checkChromeOsMoveDevicesToOu(api.ChromeOsMoveDevicesToOu o) {
   buildCounterChromeOsMoveDevicesToOu++;
   if (buildCounterChromeOsMoveDevicesToOu < 3) {
-    checkUnnamed812(o.deviceIds);
+    checkUnnamed815(o.deviceIds);
   }
   buildCounterChromeOsMoveDevicesToOu--;
 }
@@ -549,7 +568,8 @@
   buildCounterCustomer++;
   if (buildCounterCustomer < 3) {
     unittest.expect(o.alternateEmail, unittest.equals('foo'));
-    unittest.expect(o.customerCreationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.customerCreationTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.customerDomain, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -625,14 +645,14 @@
   buildCounterDomainAlias--;
 }
 
-buildUnnamed813() {
+buildUnnamed816() {
   var o = new core.List<api.DomainAlias>();
   o.add(buildDomainAlias());
   o.add(buildDomainAlias());
   return o;
 }
 
-checkUnnamed813(core.List<api.DomainAlias> o) {
+checkUnnamed816(core.List<api.DomainAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomainAlias(o[0]);
   checkDomainAlias(o[1]);
@@ -643,7 +663,7 @@
   var o = new api.DomainAliases();
   buildCounterDomainAliases++;
   if (buildCounterDomainAliases < 3) {
-    o.domainAliases = buildUnnamed813();
+    o.domainAliases = buildUnnamed816();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -654,21 +674,21 @@
 checkDomainAliases(api.DomainAliases o) {
   buildCounterDomainAliases++;
   if (buildCounterDomainAliases < 3) {
-    checkUnnamed813(o.domainAliases);
+    checkUnnamed816(o.domainAliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDomainAliases--;
 }
 
-buildUnnamed814() {
+buildUnnamed817() {
   var o = new core.List<api.DomainAlias>();
   o.add(buildDomainAlias());
   o.add(buildDomainAlias());
   return o;
 }
 
-checkUnnamed814(core.List<api.DomainAlias> o) {
+checkUnnamed817(core.List<api.DomainAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomainAlias(o[0]);
   checkDomainAlias(o[1]);
@@ -680,7 +700,7 @@
   buildCounterDomains++;
   if (buildCounterDomains < 3) {
     o.creationTime = "foo";
-    o.domainAliases = buildUnnamed814();
+    o.domainAliases = buildUnnamed817();
     o.domainName = "foo";
     o.etag = "foo";
     o.isPrimary = true;
@@ -695,7 +715,7 @@
   buildCounterDomains++;
   if (buildCounterDomains < 3) {
     unittest.expect(o.creationTime, unittest.equals('foo'));
-    checkUnnamed814(o.domainAliases);
+    checkUnnamed817(o.domainAliases);
     unittest.expect(o.domainName, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.isPrimary, unittest.isTrue);
@@ -705,14 +725,14 @@
   buildCounterDomains--;
 }
 
-buildUnnamed815() {
+buildUnnamed818() {
   var o = new core.List<api.Domains>();
   o.add(buildDomains());
   o.add(buildDomains());
   return o;
 }
 
-checkUnnamed815(core.List<api.Domains> o) {
+checkUnnamed818(core.List<api.Domains> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDomains(o[0]);
   checkDomains(o[1]);
@@ -723,7 +743,7 @@
   var o = new api.Domains2();
   buildCounterDomains2++;
   if (buildCounterDomains2 < 3) {
-    o.domains = buildUnnamed815();
+    o.domains = buildUnnamed818();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -734,34 +754,34 @@
 checkDomains2(api.Domains2 o) {
   buildCounterDomains2++;
   if (buildCounterDomains2 < 3) {
-    checkUnnamed815(o.domains);
+    checkUnnamed818(o.domains);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDomains2--;
 }
 
-buildUnnamed816() {
+buildUnnamed819() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed816(core.List<core.String> o) {
+checkUnnamed819(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed817() {
+buildUnnamed820() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed817(core.List<core.String> o) {
+checkUnnamed820(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -773,7 +793,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     o.adminCreated = true;
-    o.aliases = buildUnnamed816();
+    o.aliases = buildUnnamed819();
     o.description = "foo";
     o.directMembersCount = "foo";
     o.email = "foo";
@@ -781,7 +801,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nonEditableAliases = buildUnnamed817();
+    o.nonEditableAliases = buildUnnamed820();
   }
   buildCounterGroup--;
   return o;
@@ -791,7 +811,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     unittest.expect(o.adminCreated, unittest.isTrue);
-    checkUnnamed816(o.aliases);
+    checkUnnamed819(o.aliases);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.directMembersCount, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -799,19 +819,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed817(o.nonEditableAliases);
+    checkUnnamed820(o.nonEditableAliases);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed818() {
+buildUnnamed821() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed818(core.List<api.Group> o) {
+checkUnnamed821(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -823,7 +843,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     o.etag = "foo";
-    o.groups = buildUnnamed818();
+    o.groups = buildUnnamed821();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -835,7 +855,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed818(o.groups);
+    checkUnnamed821(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -873,14 +893,14 @@
   buildCounterMember--;
 }
 
-buildUnnamed819() {
+buildUnnamed822() {
   var o = new core.List<api.Member>();
   o.add(buildMember());
   o.add(buildMember());
   return o;
 }
 
-checkUnnamed819(core.List<api.Member> o) {
+checkUnnamed822(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMember(o[0]);
   checkMember(o[1]);
@@ -893,7 +913,7 @@
   if (buildCounterMembers < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.members = buildUnnamed819();
+    o.members = buildUnnamed822();
     o.nextPageToken = "foo";
   }
   buildCounterMembers--;
@@ -905,78 +925,12 @@
   if (buildCounterMembers < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed819(o.members);
+    checkUnnamed822(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMembers--;
 }
 
-buildUnnamed820() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed820(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterMobileDeviceApplications = 0;
-buildMobileDeviceApplications() {
-  var o = new api.MobileDeviceApplications();
-  buildCounterMobileDeviceApplications++;
-  if (buildCounterMobileDeviceApplications < 3) {
-    o.displayName = "foo";
-    o.packageName = "foo";
-    o.permission = buildUnnamed820();
-    o.versionCode = 42;
-    o.versionName = "foo";
-  }
-  buildCounterMobileDeviceApplications--;
-  return o;
-}
-
-checkMobileDeviceApplications(api.MobileDeviceApplications o) {
-  buildCounterMobileDeviceApplications++;
-  if (buildCounterMobileDeviceApplications < 3) {
-    unittest.expect(o.displayName, unittest.equals('foo'));
-    unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed820(o.permission);
-    unittest.expect(o.versionCode, unittest.equals(42));
-    unittest.expect(o.versionName, unittest.equals('foo'));
-  }
-  buildCounterMobileDeviceApplications--;
-}
-
-buildUnnamed821() {
-  var o = new core.List<api.MobileDeviceApplications>();
-  o.add(buildMobileDeviceApplications());
-  o.add(buildMobileDeviceApplications());
-  return o;
-}
-
-checkUnnamed821(core.List<api.MobileDeviceApplications> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMobileDeviceApplications(o[0]);
-  checkMobileDeviceApplications(o[1]);
-}
-
-buildUnnamed822() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed822(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed823() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -990,14 +944,80 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterMobileDeviceApplications = 0;
+buildMobileDeviceApplications() {
+  var o = new api.MobileDeviceApplications();
+  buildCounterMobileDeviceApplications++;
+  if (buildCounterMobileDeviceApplications < 3) {
+    o.displayName = "foo";
+    o.packageName = "foo";
+    o.permission = buildUnnamed823();
+    o.versionCode = 42;
+    o.versionName = "foo";
+  }
+  buildCounterMobileDeviceApplications--;
+  return o;
+}
+
+checkMobileDeviceApplications(api.MobileDeviceApplications o) {
+  buildCounterMobileDeviceApplications++;
+  if (buildCounterMobileDeviceApplications < 3) {
+    unittest.expect(o.displayName, unittest.equals('foo'));
+    unittest.expect(o.packageName, unittest.equals('foo'));
+    checkUnnamed823(o.permission);
+    unittest.expect(o.versionCode, unittest.equals(42));
+    unittest.expect(o.versionName, unittest.equals('foo'));
+  }
+  buildCounterMobileDeviceApplications--;
+}
+
 buildUnnamed824() {
+  var o = new core.List<api.MobileDeviceApplications>();
+  o.add(buildMobileDeviceApplications());
+  o.add(buildMobileDeviceApplications());
+  return o;
+}
+
+checkUnnamed824(core.List<api.MobileDeviceApplications> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMobileDeviceApplications(o[0]);
+  checkMobileDeviceApplications(o[1]);
+}
+
+buildUnnamed825() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed824(core.List<core.String> o) {
+checkUnnamed825(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed826() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed826(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed827() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed827(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1009,7 +1029,7 @@
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
     o.adbStatus = true;
-    o.applications = buildUnnamed821();
+    o.applications = buildUnnamed824();
     o.basebandVersion = "foo";
     o.bootloaderVersion = "foo";
     o.brand = "foo";
@@ -1019,7 +1039,7 @@
     o.deviceCompromisedStatus = "foo";
     o.deviceId = "foo";
     o.devicePasswordStatus = "foo";
-    o.email = buildUnnamed822();
+    o.email = buildUnnamed825();
     o.encryptionStatus = "foo";
     o.etag = "foo";
     o.firstSync = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1033,10 +1053,10 @@
     o.manufacturer = "foo";
     o.meid = "foo";
     o.model = "foo";
-    o.name = buildUnnamed823();
+    o.name = buildUnnamed826();
     o.networkOperator = "foo";
     o.os = "foo";
-    o.otherAccountsInfo = buildUnnamed824();
+    o.otherAccountsInfo = buildUnnamed827();
     o.privilege = "foo";
     o.releaseVersion = "foo";
     o.resourceId = "foo";
@@ -1057,7 +1077,7 @@
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
     unittest.expect(o.adbStatus, unittest.isTrue);
-    checkUnnamed821(o.applications);
+    checkUnnamed824(o.applications);
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.bootloaderVersion, unittest.equals('foo'));
     unittest.expect(o.brand, unittest.equals('foo'));
@@ -1067,24 +1087,26 @@
     unittest.expect(o.deviceCompromisedStatus, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
     unittest.expect(o.devicePasswordStatus, unittest.equals('foo'));
-    checkUnnamed822(o.email);
+    checkUnnamed825(o.email);
     unittest.expect(o.encryptionStatus, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    unittest.expect(o.firstSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.firstSync,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.hardware, unittest.equals('foo'));
     unittest.expect(o.hardwareId, unittest.equals('foo'));
     unittest.expect(o.imei, unittest.equals('foo'));
     unittest.expect(o.kernelVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.lastSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastSync,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.managedAccountIsOnOwnerProfile, unittest.isTrue);
     unittest.expect(o.manufacturer, unittest.equals('foo'));
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed823(o.name);
+    checkUnnamed826(o.name);
     unittest.expect(o.networkOperator, unittest.equals('foo'));
     unittest.expect(o.os, unittest.equals('foo'));
-    checkUnnamed824(o.otherAccountsInfo);
+    checkUnnamed827(o.otherAccountsInfo);
     unittest.expect(o.privilege, unittest.equals('foo'));
     unittest.expect(o.releaseVersion, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -1119,14 +1141,14 @@
   buildCounterMobileDeviceAction--;
 }
 
-buildUnnamed825() {
+buildUnnamed828() {
   var o = new core.List<api.MobileDevice>();
   o.add(buildMobileDevice());
   o.add(buildMobileDevice());
   return o;
 }
 
-checkUnnamed825(core.List<api.MobileDevice> o) {
+checkUnnamed828(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDevice(o[0]);
   checkMobileDevice(o[1]);
@@ -1139,7 +1161,7 @@
   if (buildCounterMobileDevices < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.mobiledevices = buildUnnamed825();
+    o.mobiledevices = buildUnnamed828();
     o.nextPageToken = "foo";
   }
   buildCounterMobileDevices--;
@@ -1151,7 +1173,7 @@
   if (buildCounterMobileDevices < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed825(o.mobiledevices);
+    checkUnnamed828(o.mobiledevices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMobileDevices--;
@@ -1184,20 +1206,21 @@
     unittest.expect(o.isUnread, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.notificationId, unittest.equals('foo'));
-    unittest.expect(o.sendTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.sendTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.subject, unittest.equals('foo'));
   }
   buildCounterNotification--;
 }
 
-buildUnnamed826() {
+buildUnnamed829() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed826(core.List<api.Notification> o) {
+checkUnnamed829(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -1209,7 +1232,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed826();
+    o.items = buildUnnamed829();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.unreadNotificationsCount = 42;
@@ -1222,7 +1245,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed826(o.items);
+    checkUnnamed829(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.unreadNotificationsCount, unittest.equals(42));
@@ -1265,14 +1288,14 @@
   buildCounterOrgUnit--;
 }
 
-buildUnnamed827() {
+buildUnnamed830() {
   var o = new core.List<api.OrgUnit>();
   o.add(buildOrgUnit());
   o.add(buildOrgUnit());
   return o;
 }
 
-checkUnnamed827(core.List<api.OrgUnit> o) {
+checkUnnamed830(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgUnit(o[0]);
   checkOrgUnit(o[1]);
@@ -1285,7 +1308,7 @@
   if (buildCounterOrgUnits < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.organizationUnits = buildUnnamed827();
+    o.organizationUnits = buildUnnamed830();
   }
   buildCounterOrgUnits--;
   return o;
@@ -1296,19 +1319,19 @@
   if (buildCounterOrgUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed827(o.organizationUnits);
+    checkUnnamed830(o.organizationUnits);
   }
   buildCounterOrgUnits--;
 }
 
-buildUnnamed828() {
+buildUnnamed831() {
   var o = new core.List<api.Privilege>();
   o.add(buildPrivilege());
   o.add(buildPrivilege());
   return o;
 }
 
-checkUnnamed828(core.List<api.Privilege> o) {
+checkUnnamed831(core.List<api.Privilege> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrivilege(o[0]);
   checkPrivilege(o[1]);
@@ -1319,7 +1342,7 @@
   var o = new api.Privilege();
   buildCounterPrivilege++;
   if (buildCounterPrivilege < 3) {
-    o.childPrivileges = buildUnnamed828();
+    o.childPrivileges = buildUnnamed831();
     o.etag = "foo";
     o.isOuScopable = true;
     o.kind = "foo";
@@ -1334,7 +1357,7 @@
 checkPrivilege(api.Privilege o) {
   buildCounterPrivilege++;
   if (buildCounterPrivilege < 3) {
-    checkUnnamed828(o.childPrivileges);
+    checkUnnamed831(o.childPrivileges);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.isOuScopable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1345,14 +1368,14 @@
   buildCounterPrivilege--;
 }
 
-buildUnnamed829() {
+buildUnnamed832() {
   var o = new core.List<api.Privilege>();
   o.add(buildPrivilege());
   o.add(buildPrivilege());
   return o;
 }
 
-checkUnnamed829(core.List<api.Privilege> o) {
+checkUnnamed832(core.List<api.Privilege> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrivilege(o[0]);
   checkPrivilege(o[1]);
@@ -1364,7 +1387,7 @@
   buildCounterPrivileges++;
   if (buildCounterPrivileges < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed829();
+    o.items = buildUnnamed832();
     o.kind = "foo";
   }
   buildCounterPrivileges--;
@@ -1375,7 +1398,7 @@
   buildCounterPrivileges++;
   if (buildCounterPrivileges < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed829(o.items);
+    checkUnnamed832(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPrivileges--;
@@ -1402,14 +1425,14 @@
   buildCounterRoleRolePrivileges--;
 }
 
-buildUnnamed830() {
+buildUnnamed833() {
   var o = new core.List<api.RoleRolePrivileges>();
   o.add(buildRoleRolePrivileges());
   o.add(buildRoleRolePrivileges());
   return o;
 }
 
-checkUnnamed830(core.List<api.RoleRolePrivileges> o) {
+checkUnnamed833(core.List<api.RoleRolePrivileges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoleRolePrivileges(o[0]);
   checkRoleRolePrivileges(o[1]);
@@ -1427,7 +1450,7 @@
     o.roleDescription = "foo";
     o.roleId = "foo";
     o.roleName = "foo";
-    o.rolePrivileges = buildUnnamed830();
+    o.rolePrivileges = buildUnnamed833();
   }
   buildCounterRole--;
   return o;
@@ -1443,7 +1466,7 @@
     unittest.expect(o.roleDescription, unittest.equals('foo'));
     unittest.expect(o.roleId, unittest.equals('foo'));
     unittest.expect(o.roleName, unittest.equals('foo'));
-    checkUnnamed830(o.rolePrivileges);
+    checkUnnamed833(o.rolePrivileges);
   }
   buildCounterRole--;
 }
@@ -1479,14 +1502,14 @@
   buildCounterRoleAssignment--;
 }
 
-buildUnnamed831() {
+buildUnnamed834() {
   var o = new core.List<api.RoleAssignment>();
   o.add(buildRoleAssignment());
   o.add(buildRoleAssignment());
   return o;
 }
 
-checkUnnamed831(core.List<api.RoleAssignment> o) {
+checkUnnamed834(core.List<api.RoleAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoleAssignment(o[0]);
   checkRoleAssignment(o[1]);
@@ -1498,7 +1521,7 @@
   buildCounterRoleAssignments++;
   if (buildCounterRoleAssignments < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed831();
+    o.items = buildUnnamed834();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1510,21 +1533,21 @@
   buildCounterRoleAssignments++;
   if (buildCounterRoleAssignments < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed831(o.items);
+    checkUnnamed834(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRoleAssignments--;
 }
 
-buildUnnamed832() {
+buildUnnamed835() {
   var o = new core.List<api.Role>();
   o.add(buildRole());
   o.add(buildRole());
   return o;
 }
 
-checkUnnamed832(core.List<api.Role> o) {
+checkUnnamed835(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRole(o[0]);
   checkRole(o[1]);
@@ -1536,7 +1559,7 @@
   buildCounterRoles++;
   if (buildCounterRoles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed832();
+    o.items = buildUnnamed835();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1548,21 +1571,21 @@
   buildCounterRoles++;
   if (buildCounterRoles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed832(o.items);
+    checkUnnamed835(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRoles--;
 }
 
-buildUnnamed833() {
+buildUnnamed836() {
   var o = new core.List<api.SchemaFieldSpec>();
   o.add(buildSchemaFieldSpec());
   o.add(buildSchemaFieldSpec());
   return o;
 }
 
-checkUnnamed833(core.List<api.SchemaFieldSpec> o) {
+checkUnnamed836(core.List<api.SchemaFieldSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchemaFieldSpec(o[0]);
   checkSchemaFieldSpec(o[1]);
@@ -1574,7 +1597,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     o.etag = "foo";
-    o.fields = buildUnnamed833();
+    o.fields = buildUnnamed836();
     o.kind = "foo";
     o.schemaId = "foo";
     o.schemaName = "foo";
@@ -1587,7 +1610,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed833(o.fields);
+    checkUnnamed836(o.fields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.schemaId, unittest.equals('foo'));
     unittest.expect(o.schemaName, unittest.equals('foo'));
@@ -1607,7 +1630,8 @@
   return o;
 }
 
-checkSchemaFieldSpecNumericIndexingSpec(api.SchemaFieldSpecNumericIndexingSpec o) {
+checkSchemaFieldSpecNumericIndexingSpec(
+    api.SchemaFieldSpecNumericIndexingSpec o) {
   buildCounterSchemaFieldSpecNumericIndexingSpec++;
   if (buildCounterSchemaFieldSpecNumericIndexingSpec < 3) {
     unittest.expect(o.maxValue, unittest.equals(42.0));
@@ -1651,14 +1675,14 @@
   buildCounterSchemaFieldSpec--;
 }
 
-buildUnnamed834() {
+buildUnnamed837() {
   var o = new core.List<api.Schema>();
   o.add(buildSchema());
   o.add(buildSchema());
   return o;
 }
 
-checkUnnamed834(core.List<api.Schema> o) {
+checkUnnamed837(core.List<api.Schema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchema(o[0]);
   checkSchema(o[1]);
@@ -1671,7 +1695,7 @@
   if (buildCounterSchemas < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.schemas = buildUnnamed834();
+    o.schemas = buildUnnamed837();
   }
   buildCounterSchemas--;
   return o;
@@ -1682,19 +1706,19 @@
   if (buildCounterSchemas < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed834(o.schemas);
+    checkUnnamed837(o.schemas);
   }
   buildCounterSchemas--;
 }
 
-buildUnnamed835() {
+buildUnnamed838() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed835(core.List<core.String> o) {
+checkUnnamed838(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1711,7 +1735,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nativeApp = true;
-    o.scopes = buildUnnamed835();
+    o.scopes = buildUnnamed838();
     o.userKey = "foo";
   }
   buildCounterToken--;
@@ -1727,20 +1751,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nativeApp, unittest.isTrue);
-    checkUnnamed835(o.scopes);
+    checkUnnamed838(o.scopes);
     unittest.expect(o.userKey, unittest.equals('foo'));
   }
   buildCounterToken--;
 }
 
-buildUnnamed836() {
+buildUnnamed839() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed836(core.List<api.Token> o) {
+checkUnnamed839(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -1752,7 +1776,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed836();
+    o.items = buildUnnamed839();
     o.kind = "foo";
   }
   buildCounterTokens--;
@@ -1763,46 +1787,46 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed836(o.items);
+    checkUnnamed839(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTokens--;
 }
 
-buildUnnamed837() {
+buildUnnamed840() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed837(core.List<core.String> o) {
+checkUnnamed840(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed838() {
+buildUnnamed841() {
   var o = new core.Map<core.String, api.UserCustomProperties>();
   o["x"] = buildUserCustomProperties();
   o["y"] = buildUserCustomProperties();
   return o;
 }
 
-checkUnnamed838(core.Map<core.String, api.UserCustomProperties> o) {
+checkUnnamed841(core.Map<core.String, api.UserCustomProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserCustomProperties(o["x"]);
   checkUserCustomProperties(o["y"]);
 }
 
-buildUnnamed839() {
+buildUnnamed842() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed839(core.List<core.String> o) {
+checkUnnamed842(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1813,20 +1837,36 @@
   var o = new api.User();
   buildCounterUser++;
   if (buildCounterUser < 3) {
-    o.addresses = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.addresses = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.agreedToTerms = true;
-    o.aliases = buildUnnamed837();
+    o.aliases = buildUnnamed840();
     o.changePasswordAtNextLogin = true;
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.customSchemas = buildUnnamed838();
+    o.customSchemas = buildUnnamed841();
     o.customerId = "foo";
     o.deletionTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.emails = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.emails = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.etag = "foo";
-    o.externalIds = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.externalIds = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.hashFunction = "foo";
     o.id = "foo";
-    o.ims = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.ims = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.includeInGlobalAddressList = true;
     o.ipWhitelisted = true;
     o.isAdmin = true;
@@ -1834,27 +1874,67 @@
     o.isEnforcedIn2Sv = true;
     o.isEnrolledIn2Sv = true;
     o.isMailboxSetup = true;
-    o.keywords = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.keywords = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.kind = "foo";
-    o.languages = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.languages = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.lastLoginTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.locations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.locations = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.name = buildUserName();
-    o.nonEditableAliases = buildUnnamed839();
-    o.notes = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.nonEditableAliases = buildUnnamed842();
+    o.notes = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.orgUnitPath = "foo";
-    o.organizations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.organizations = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.password = "foo";
-    o.phones = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-    o.posixAccounts = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.phones = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
+    o.posixAccounts = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.primaryEmail = "foo";
-    o.relations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-    o.sshPublicKeys = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.relations = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
+    o.sshPublicKeys = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.suspended = true;
     o.suspensionReason = "foo";
     o.thumbnailPhotoEtag = "foo";
     o.thumbnailPhotoUrl = "foo";
-    o.websites = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.websites = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
   }
   buildCounterUser--;
   return o;
@@ -1863,20 +1943,38 @@
 checkUser(api.User o) {
   buildCounterUser++;
   if (buildCounterUser < 3) {
-    var casted3 = (o.addresses) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
+    var casted3 = (o.addresses) as core.Map;
+    unittest.expect(casted3, unittest.hasLength(3));
+    unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted3["bool"], unittest.equals(true));
+    unittest.expect(casted3["string"], unittest.equals('foo'));
     unittest.expect(o.agreedToTerms, unittest.isTrue);
-    checkUnnamed837(o.aliases);
+    checkUnnamed840(o.aliases);
     unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
-    unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed838(o.customSchemas);
+    unittest.expect(o.creationTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed841(o.customSchemas);
     unittest.expect(o.customerId, unittest.equals('foo'));
-    unittest.expect(o.deletionTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    var casted4 = (o.emails) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+    unittest.expect(o.deletionTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    var casted4 = (o.emails) as core.Map;
+    unittest.expect(casted4, unittest.hasLength(3));
+    unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted4["bool"], unittest.equals(true));
+    unittest.expect(casted4["string"], unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    var casted5 = (o.externalIds) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
+    var casted5 = (o.externalIds) as core.Map;
+    unittest.expect(casted5, unittest.hasLength(3));
+    unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted5["bool"], unittest.equals(true));
+    unittest.expect(casted5["string"], unittest.equals('foo'));
     unittest.expect(o.hashFunction, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    var casted6 = (o.ims) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+    var casted6 = (o.ims) as core.Map;
+    unittest.expect(casted6, unittest.hasLength(3));
+    unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted6["bool"], unittest.equals(true));
+    unittest.expect(casted6["string"], unittest.equals('foo'));
     unittest.expect(o.includeInGlobalAddressList, unittest.isTrue);
     unittest.expect(o.ipWhitelisted, unittest.isTrue);
     unittest.expect(o.isAdmin, unittest.isTrue);
@@ -1884,27 +1982,68 @@
     unittest.expect(o.isEnforcedIn2Sv, unittest.isTrue);
     unittest.expect(o.isEnrolledIn2Sv, unittest.isTrue);
     unittest.expect(o.isMailboxSetup, unittest.isTrue);
-    var casted7 = (o.keywords) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
+    var casted7 = (o.keywords) as core.Map;
+    unittest.expect(casted7, unittest.hasLength(3));
+    unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted7["bool"], unittest.equals(true));
+    unittest.expect(casted7["string"], unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    var casted8 = (o.languages) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
-    unittest.expect(o.lastLoginTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    var casted9 = (o.locations) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
+    var casted8 = (o.languages) as core.Map;
+    unittest.expect(casted8, unittest.hasLength(3));
+    unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted8["bool"], unittest.equals(true));
+    unittest.expect(casted8["string"], unittest.equals('foo'));
+    unittest.expect(o.lastLoginTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    var casted9 = (o.locations) as core.Map;
+    unittest.expect(casted9, unittest.hasLength(3));
+    unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted9["bool"], unittest.equals(true));
+    unittest.expect(casted9["string"], unittest.equals('foo'));
     checkUserName(o.name);
-    checkUnnamed839(o.nonEditableAliases);
-    var casted10 = (o.notes) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+    checkUnnamed842(o.nonEditableAliases);
+    var casted10 = (o.notes) as core.Map;
+    unittest.expect(casted10, unittest.hasLength(3));
+    unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted10["bool"], unittest.equals(true));
+    unittest.expect(casted10["string"], unittest.equals('foo'));
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
-    var casted11 = (o.organizations) as core.Map; unittest.expect(casted11, unittest.hasLength(3)); unittest.expect(casted11["list"], unittest.equals([1, 2, 3])); unittest.expect(casted11["bool"], unittest.equals(true)); unittest.expect(casted11["string"], unittest.equals('foo')); 
+    var casted11 = (o.organizations) as core.Map;
+    unittest.expect(casted11, unittest.hasLength(3));
+    unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted11["bool"], unittest.equals(true));
+    unittest.expect(casted11["string"], unittest.equals('foo'));
     unittest.expect(o.password, unittest.equals('foo'));
-    var casted12 = (o.phones) as core.Map; unittest.expect(casted12, unittest.hasLength(3)); unittest.expect(casted12["list"], unittest.equals([1, 2, 3])); unittest.expect(casted12["bool"], unittest.equals(true)); unittest.expect(casted12["string"], unittest.equals('foo')); 
-    var casted13 = (o.posixAccounts) as core.Map; unittest.expect(casted13, unittest.hasLength(3)); unittest.expect(casted13["list"], unittest.equals([1, 2, 3])); unittest.expect(casted13["bool"], unittest.equals(true)); unittest.expect(casted13["string"], unittest.equals('foo')); 
+    var casted12 = (o.phones) as core.Map;
+    unittest.expect(casted12, unittest.hasLength(3));
+    unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted12["bool"], unittest.equals(true));
+    unittest.expect(casted12["string"], unittest.equals('foo'));
+    var casted13 = (o.posixAccounts) as core.Map;
+    unittest.expect(casted13, unittest.hasLength(3));
+    unittest.expect(casted13["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted13["bool"], unittest.equals(true));
+    unittest.expect(casted13["string"], unittest.equals('foo'));
     unittest.expect(o.primaryEmail, unittest.equals('foo'));
-    var casted14 = (o.relations) as core.Map; unittest.expect(casted14, unittest.hasLength(3)); unittest.expect(casted14["list"], unittest.equals([1, 2, 3])); unittest.expect(casted14["bool"], unittest.equals(true)); unittest.expect(casted14["string"], unittest.equals('foo')); 
-    var casted15 = (o.sshPublicKeys) as core.Map; unittest.expect(casted15, unittest.hasLength(3)); unittest.expect(casted15["list"], unittest.equals([1, 2, 3])); unittest.expect(casted15["bool"], unittest.equals(true)); unittest.expect(casted15["string"], unittest.equals('foo')); 
+    var casted14 = (o.relations) as core.Map;
+    unittest.expect(casted14, unittest.hasLength(3));
+    unittest.expect(casted14["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted14["bool"], unittest.equals(true));
+    unittest.expect(casted14["string"], unittest.equals('foo'));
+    var casted15 = (o.sshPublicKeys) as core.Map;
+    unittest.expect(casted15, unittest.hasLength(3));
+    unittest.expect(casted15["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted15["bool"], unittest.equals(true));
+    unittest.expect(casted15["string"], unittest.equals('foo'));
     unittest.expect(o.suspended, unittest.isTrue);
     unittest.expect(o.suspensionReason, unittest.equals('foo'));
     unittest.expect(o.thumbnailPhotoEtag, unittest.equals('foo'));
     unittest.expect(o.thumbnailPhotoUrl, unittest.equals('foo'));
-    var casted16 = (o.websites) as core.Map; unittest.expect(casted16, unittest.hasLength(3)); unittest.expect(casted16["list"], unittest.equals([1, 2, 3])); unittest.expect(casted16["bool"], unittest.equals(true)); unittest.expect(casted16["string"], unittest.equals('foo')); 
+    var casted16 = (o.websites) as core.Map;
+    unittest.expect(casted16, unittest.hasLength(3));
+    unittest.expect(casted16["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted16["bool"], unittest.equals(true));
+    unittest.expect(casted16["string"], unittest.equals('foo'));
   }
   buildCounterUser--;
 }
@@ -1975,15 +2114,31 @@
 
 buildUserCustomProperties() {
   var o = new api.UserCustomProperties();
-  o["a"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["b"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["a"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["b"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
 checkUserCustomProperties(api.UserCustomProperties o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted17 = (o["a"]) as core.Map; unittest.expect(casted17, unittest.hasLength(3)); unittest.expect(casted17["list"], unittest.equals([1, 2, 3])); unittest.expect(casted17["bool"], unittest.equals(true)); unittest.expect(casted17["string"], unittest.equals('foo')); 
-  var casted18 = (o["b"]) as core.Map; unittest.expect(casted18, unittest.hasLength(3)); unittest.expect(casted18["list"], unittest.equals([1, 2, 3])); unittest.expect(casted18["bool"], unittest.equals(true)); unittest.expect(casted18["string"], unittest.equals('foo')); 
+  var casted17 = (o["a"]) as core.Map;
+  unittest.expect(casted17, unittest.hasLength(3));
+  unittest.expect(casted17["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted17["bool"], unittest.equals(true));
+  unittest.expect(casted17["string"], unittest.equals('foo'));
+  var casted18 = (o["b"]) as core.Map;
+  unittest.expect(casted18, unittest.hasLength(3));
+  unittest.expect(casted18["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted18["bool"], unittest.equals(true));
+  unittest.expect(casted18["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterUserEmail = 0;
@@ -2402,14 +2557,14 @@
   buildCounterUserWebsite--;
 }
 
-buildUnnamed840() {
+buildUnnamed843() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed840(core.List<api.User> o) {
+checkUnnamed843(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -2424,7 +2579,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.triggerEvent = "foo";
-    o.users = buildUnnamed840();
+    o.users = buildUnnamed843();
   }
   buildCounterUsers--;
   return o;
@@ -2437,7 +2592,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.triggerEvent, unittest.equals('foo'));
-    checkUnnamed840(o.users);
+    checkUnnamed843(o.users);
   }
   buildCounterUsers--;
 }
@@ -2467,14 +2622,14 @@
   buildCounterVerificationCode--;
 }
 
-buildUnnamed841() {
+buildUnnamed844() {
   var o = new core.List<api.VerificationCode>();
   o.add(buildVerificationCode());
   o.add(buildVerificationCode());
   return o;
 }
 
-checkUnnamed841(core.List<api.VerificationCode> o) {
+checkUnnamed844(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVerificationCode(o[0]);
   checkVerificationCode(o[1]);
@@ -2486,7 +2641,7 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed841();
+    o.items = buildUnnamed844();
     o.kind = "foo";
   }
   buildCounterVerificationCodes--;
@@ -2497,51 +2652,12 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed841(o.items);
+    checkUnnamed844(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVerificationCodes--;
 }
 
-buildUnnamed842() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed842(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed843() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed843(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed844() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed844(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed845() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -2555,6 +2671,44 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed846() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed846(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed847() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed847(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed848() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed848(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
 
 main() {
   unittest.group("obj-schema-Alias", () {
@@ -2565,7 +2719,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Aliases", () {
     unittest.test("to-json--from-json", () {
       var o = buildAliases();
@@ -2574,7 +2727,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Asp", () {
     unittest.test("to-json--from-json", () {
       var o = buildAsp();
@@ -2583,7 +2735,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Asps", () {
     unittest.test("to-json--from-json", () {
       var o = buildAsps();
@@ -2592,7 +2743,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CalendarResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildCalendarResource();
@@ -2601,7 +2751,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CalendarResources", () {
     unittest.test("to-json--from-json", () {
       var o = buildCalendarResources();
@@ -2610,7 +2759,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Channel", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannel();
@@ -2619,7 +2767,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChromeOsDeviceActiveTimeRanges", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDeviceActiveTimeRanges();
@@ -2628,7 +2775,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChromeOsDeviceRecentUsers", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDeviceRecentUsers();
@@ -2637,7 +2783,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChromeOsDevice", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDevice();
@@ -2646,7 +2791,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChromeOsDeviceAction", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDeviceAction();
@@ -2655,7 +2799,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChromeOsDevices", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDevices();
@@ -2664,7 +2807,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChromeOsMoveDevicesToOu", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsMoveDevicesToOu();
@@ -2673,7 +2815,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Customer", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomer();
@@ -2682,7 +2823,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomerPostalAddress", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomerPostalAddress();
@@ -2691,7 +2831,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DomainAlias", () {
     unittest.test("to-json--from-json", () {
       var o = buildDomainAlias();
@@ -2700,7 +2839,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DomainAliases", () {
     unittest.test("to-json--from-json", () {
       var o = buildDomainAliases();
@@ -2709,7 +2847,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Domains", () {
     unittest.test("to-json--from-json", () {
       var o = buildDomains();
@@ -2718,7 +2855,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Domains2", () {
     unittest.test("to-json--from-json", () {
       var o = buildDomains2();
@@ -2727,7 +2863,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Group", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroup();
@@ -2736,7 +2871,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Groups", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroups();
@@ -2745,7 +2879,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Member", () {
     unittest.test("to-json--from-json", () {
       var o = buildMember();
@@ -2754,7 +2887,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Members", () {
     unittest.test("to-json--from-json", () {
       var o = buildMembers();
@@ -2763,7 +2895,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileDeviceApplications", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileDeviceApplications();
@@ -2772,7 +2903,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileDevice", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileDevice();
@@ -2781,7 +2911,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileDeviceAction", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileDeviceAction();
@@ -2790,7 +2919,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileDevices", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileDevices();
@@ -2799,7 +2927,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Notification", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotification();
@@ -2808,7 +2935,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Notifications", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotifications();
@@ -2817,7 +2943,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OrgUnit", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrgUnit();
@@ -2826,7 +2951,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OrgUnits", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrgUnits();
@@ -2835,7 +2959,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Privilege", () {
     unittest.test("to-json--from-json", () {
       var o = buildPrivilege();
@@ -2844,7 +2967,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Privileges", () {
     unittest.test("to-json--from-json", () {
       var o = buildPrivileges();
@@ -2853,7 +2975,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoleRolePrivileges", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoleRolePrivileges();
@@ -2862,7 +2983,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Role", () {
     unittest.test("to-json--from-json", () {
       var o = buildRole();
@@ -2871,7 +2991,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoleAssignment", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoleAssignment();
@@ -2880,7 +2999,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoleAssignments", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoleAssignments();
@@ -2889,7 +3007,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Roles", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoles();
@@ -2898,7 +3015,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Schema", () {
     unittest.test("to-json--from-json", () {
       var o = buildSchema();
@@ -2907,7 +3023,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SchemaFieldSpecNumericIndexingSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildSchemaFieldSpecNumericIndexingSpec();
@@ -2916,7 +3031,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SchemaFieldSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildSchemaFieldSpec();
@@ -2925,7 +3039,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Schemas", () {
     unittest.test("to-json--from-json", () {
       var o = buildSchemas();
@@ -2934,7 +3047,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Token", () {
     unittest.test("to-json--from-json", () {
       var o = buildToken();
@@ -2943,7 +3055,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Tokens", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokens();
@@ -2952,7 +3063,6 @@
     });
   });
 
-
   unittest.group("obj-schema-User", () {
     unittest.test("to-json--from-json", () {
       var o = buildUser();
@@ -2961,7 +3071,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserAbout", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserAbout();
@@ -2970,7 +3079,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserAddress", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserAddress();
@@ -2979,7 +3087,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserCustomProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserCustomProperties();
@@ -2988,7 +3095,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserEmail", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserEmail();
@@ -2997,7 +3103,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserExternalId", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserExternalId();
@@ -3006,7 +3111,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserIm", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserIm();
@@ -3015,7 +3119,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserKeyword", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserKeyword();
@@ -3024,7 +3127,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserLanguage", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserLanguage();
@@ -3033,7 +3135,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserLocation();
@@ -3042,7 +3143,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserMakeAdmin", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserMakeAdmin();
@@ -3051,7 +3151,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserName", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserName();
@@ -3060,7 +3159,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserOrganization", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserOrganization();
@@ -3069,7 +3167,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserPhone", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserPhone();
@@ -3078,7 +3175,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserPhoto", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserPhoto();
@@ -3087,7 +3183,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserPosixAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserPosixAccount();
@@ -3096,7 +3191,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserRelation", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserRelation();
@@ -3105,7 +3199,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserSshPublicKey", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserSshPublicKey();
@@ -3114,7 +3207,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserUndelete", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserUndelete();
@@ -3123,7 +3215,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserWebsite", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserWebsite();
@@ -3132,7 +3223,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Users", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsers();
@@ -3141,7 +3231,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VerificationCode", () {
     unittest.test("to-json--from-json", () {
       var o = buildVerificationCode();
@@ -3150,7 +3239,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VerificationCodes", () {
     unittest.test("to-json--from-json", () {
       var o = buildVerificationCodes();
@@ -3159,10 +3247,8 @@
     });
   });
 
-
   unittest.group("resource-AspsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.AspsResourceApi res = new api.AdminApi(mock).asps;
       var arg_userKey = "foo";
@@ -3172,18 +3258,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/asps/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/asps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/asps/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3199,16 +3290,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3217,7 +3309,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AspsResourceApi res = new api.AdminApi(mock).asps;
       var arg_userKey = "foo";
@@ -3227,18 +3318,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/asps/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/asps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/asps/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3254,27 +3350,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAsp());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userKey, arg_codeId).then(unittest.expectAsync1(((api.Asp response) {
+      res
+          .get(arg_userKey, arg_codeId)
+          .then(unittest.expectAsync1(((api.Asp response) {
         checkAsp(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.AspsResourceApi res = new api.AdminApi(mock).asps;
       var arg_userKey = "foo";
@@ -3283,18 +3381,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/asps", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/asps"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/asps"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -3307,16 +3410,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAsps());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3325,13 +3429,10 @@
         checkAsps(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelsResourceApi", () {
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.ChannelsResourceApi res = new api.AdminApi(mock).channels;
       var arg_request = buildChannel();
@@ -3343,9 +3444,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("admin/directory_v1/channels/stop"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("admin/directory_v1/channels/stop"));
         pathOffset += 32;
 
         var query = (req.url).query;
@@ -3358,31 +3461,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.stop(arg_request).then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-ChromeosdevicesResourceApi", () {
     unittest.test("method--action", () {
-
       var mock = new HttpServerMock();
-      api.ChromeosdevicesResourceApi res = new api.AdminApi(mock).chromeosdevices;
+      api.ChromeosdevicesResourceApi res =
+          new api.AdminApi(mock).chromeosdevices;
       var arg_request = buildChromeOsDeviceAction();
       var arg_customerId = "foo";
       var arg_resourceId = "foo";
@@ -3394,25 +3496,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/devices/chromeos/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/devices/chromeos/"));
         pathOffset += 18;
         index = path.indexOf("/action", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/action"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/action"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -3425,27 +3534,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.action(arg_request, arg_customerId, arg_resourceId).then(unittest.expectAsync1((_) {}));
+      res
+          .action(arg_request, arg_customerId, arg_resourceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ChromeosdevicesResourceApi res = new api.AdminApi(mock).chromeosdevices;
+      api.ChromeosdevicesResourceApi res =
+          new api.AdminApi(mock).chromeosdevices;
       var arg_customerId = "foo";
       var arg_deviceId = "foo";
       var arg_projection = "foo";
@@ -3454,18 +3566,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/devices/chromeos/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/devices/chromeos/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3481,30 +3598,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChromeOsDevice());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerId, arg_deviceId, projection: arg_projection).then(unittest.expectAsync1(((api.ChromeOsDevice response) {
+      res
+          .get(arg_customerId, arg_deviceId, projection: arg_projection)
+          .then(unittest.expectAsync1(((api.ChromeOsDevice response) {
         checkChromeOsDevice(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ChromeosdevicesResourceApi res = new api.AdminApi(mock).chromeosdevices;
+      api.ChromeosdevicesResourceApi res =
+          new api.AdminApi(mock).chromeosdevices;
       var arg_customerId = "foo";
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
@@ -3518,18 +3639,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/devices/chromeos"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/devices/chromeos"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -3542,36 +3668,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["orgUnitPath"].first, unittest.equals(arg_orgUnitPath));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["orgUnitPath"].first, unittest.equals(arg_orgUnitPath));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
-        unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
-
+        unittest.expect(
+            queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChromeOsDevices());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customerId, maxResults: arg_maxResults, orderBy: arg_orderBy, orgUnitPath: arg_orgUnitPath, pageToken: arg_pageToken, projection: arg_projection, query: arg_query, sortOrder: arg_sortOrder).then(unittest.expectAsync1(((api.ChromeOsDevices response) {
+      res
+          .list(arg_customerId,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              orgUnitPath: arg_orgUnitPath,
+              pageToken: arg_pageToken,
+              projection: arg_projection,
+              query: arg_query,
+              sortOrder: arg_sortOrder)
+          .then(unittest.expectAsync1(((api.ChromeOsDevices response) {
         checkChromeOsDevices(response);
       })));
     });
 
     unittest.test("method--moveDevicesToOu", () {
-
       var mock = new HttpServerMock();
-      api.ChromeosdevicesResourceApi res = new api.AdminApi(mock).chromeosdevices;
+      api.ChromeosdevicesResourceApi res =
+          new api.AdminApi(mock).chromeosdevices;
       var arg_request = buildChromeOsMoveDevicesToOu();
       var arg_customerId = "foo";
       var arg_orgUnitPath = "foo";
@@ -3583,18 +3725,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/moveDevicesToOu", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/devices/chromeos/moveDevicesToOu"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 33),
+            unittest.equals("/devices/chromeos/moveDevicesToOu"));
         pathOffset += 33;
 
         var query = (req.url).query;
@@ -3607,28 +3754,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["orgUnitPath"].first, unittest.equals(arg_orgUnitPath));
-
+        unittest.expect(
+            queryMap["orgUnitPath"].first, unittest.equals(arg_orgUnitPath));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.moveDevicesToOu(arg_request, arg_customerId, arg_orgUnitPath).then(unittest.expectAsync1((_) {}));
+      res
+          .moveDevicesToOu(arg_request, arg_customerId, arg_orgUnitPath)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ChromeosdevicesResourceApi res = new api.AdminApi(mock).chromeosdevices;
+      api.ChromeosdevicesResourceApi res =
+          new api.AdminApi(mock).chromeosdevices;
       var arg_request = buildChromeOsDevice();
       var arg_customerId = "foo";
       var arg_deviceId = "foo";
@@ -3641,18 +3792,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/devices/chromeos/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/devices/chromeos/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3668,30 +3824,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChromeOsDevice());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customerId, arg_deviceId, projection: arg_projection).then(unittest.expectAsync1(((api.ChromeOsDevice response) {
+      res
+          .patch(arg_request, arg_customerId, arg_deviceId,
+              projection: arg_projection)
+          .then(unittest.expectAsync1(((api.ChromeOsDevice response) {
         checkChromeOsDevice(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ChromeosdevicesResourceApi res = new api.AdminApi(mock).chromeosdevices;
+      api.ChromeosdevicesResourceApi res =
+          new api.AdminApi(mock).chromeosdevices;
       var arg_request = buildChromeOsDevice();
       var arg_customerId = "foo";
       var arg_deviceId = "foo";
@@ -3704,18 +3865,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/devices/chromeos/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/devices/chromeos/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3731,32 +3897,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChromeOsDevice());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customerId, arg_deviceId, projection: arg_projection).then(unittest.expectAsync1(((api.ChromeOsDevice response) {
+      res
+          .update(arg_request, arg_customerId, arg_deviceId,
+              projection: arg_projection)
+          .then(unittest.expectAsync1(((api.ChromeOsDevice response) {
         checkChromeOsDevice(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CustomersResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.AdminApi(mock).customers;
       var arg_customerKey = "foo";
@@ -3765,11 +3933,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3785,27 +3956,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerKey).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .get(arg_customerKey)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.AdminApi(mock).customers;
       var arg_request = buildCustomer();
@@ -3818,11 +3991,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3838,27 +4014,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customerKey).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .patch(arg_request, arg_customerKey)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.AdminApi(mock).customers;
       var arg_request = buildCustomer();
@@ -3871,11 +4049,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3891,31 +4072,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customerKey).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .update(arg_request, arg_customerKey)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DomainAliasesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.DomainAliasesResourceApi res = new api.AdminApi(mock).domainAliases;
       var arg_customer = "foo";
@@ -3925,18 +4106,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domainaliases/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/domainaliases/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/domainaliases/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3952,25 +4138,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customer, arg_domainAliasName).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customer, arg_domainAliasName)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DomainAliasesResourceApi res = new api.AdminApi(mock).domainAliases;
       var arg_customer = "foo";
@@ -3980,18 +4168,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domainaliases/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/domainaliases/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/domainaliases/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4007,27 +4200,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDomainAlias());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customer, arg_domainAliasName).then(unittest.expectAsync1(((api.DomainAlias response) {
+      res
+          .get(arg_customer, arg_domainAliasName)
+          .then(unittest.expectAsync1(((api.DomainAlias response) {
         checkDomainAlias(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.DomainAliasesResourceApi res = new api.AdminApi(mock).domainAliases;
       var arg_request = buildDomainAlias();
@@ -4040,18 +4235,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domainaliases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/domainaliases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/domainaliases"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -4064,27 +4264,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDomainAlias());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customer).then(unittest.expectAsync1(((api.DomainAlias response) {
+      res
+          .insert(arg_request, arg_customer)
+          .then(unittest.expectAsync1(((api.DomainAlias response) {
         checkDomainAlias(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.DomainAliasesResourceApi res = new api.AdminApi(mock).domainAliases;
       var arg_customer = "foo";
@@ -4094,18 +4296,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domainaliases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/domainaliases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/domainaliases"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -4118,32 +4325,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["parentDomainName"].first, unittest.equals(arg_parentDomainName));
-
+        unittest.expect(queryMap["parentDomainName"].first,
+            unittest.equals(arg_parentDomainName));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDomainAliases());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer, parentDomainName: arg_parentDomainName).then(unittest.expectAsync1(((api.DomainAliases response) {
+      res
+          .list(arg_customer, parentDomainName: arg_parentDomainName)
+          .then(unittest.expectAsync1(((api.DomainAliases response) {
         checkDomainAliases(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DomainsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.DomainsResourceApi res = new api.AdminApi(mock).domains;
       var arg_customer = "foo";
@@ -4153,18 +4361,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domains/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/domains/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/domains/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4180,25 +4393,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customer, arg_domainName).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customer, arg_domainName)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DomainsResourceApi res = new api.AdminApi(mock).domains;
       var arg_customer = "foo";
@@ -4208,18 +4423,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domains/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/domains/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/domains/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4235,27 +4455,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDomains());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customer, arg_domainName).then(unittest.expectAsync1(((api.Domains response) {
+      res
+          .get(arg_customer, arg_domainName)
+          .then(unittest.expectAsync1(((api.Domains response) {
         checkDomains(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.DomainsResourceApi res = new api.AdminApi(mock).domains;
       var arg_request = buildDomains();
@@ -4268,18 +4490,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domains", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/domains"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/domains"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4292,27 +4519,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDomains());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customer).then(unittest.expectAsync1(((api.Domains response) {
+      res
+          .insert(arg_request, arg_customer)
+          .then(unittest.expectAsync1(((api.Domains response) {
         checkDomains(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.DomainsResourceApi res = new api.AdminApi(mock).domains;
       var arg_customer = "foo";
@@ -4321,18 +4550,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/domains", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/domains"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/domains"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4345,31 +4579,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDomains2());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer).then(unittest.expectAsync1(((api.Domains2 response) {
+      res
+          .list(arg_customer)
+          .then(unittest.expectAsync1(((api.Domains2 response) {
         checkDomains2(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GroupsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.AdminApi(mock).groups;
       var arg_groupKey = "foo";
@@ -4378,11 +4612,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4398,16 +4635,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4416,7 +4654,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.AdminApi(mock).groups;
       var arg_groupKey = "foo";
@@ -4425,11 +4662,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4445,16 +4685,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroup());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4465,7 +4706,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.AdminApi(mock).groups;
       var arg_request = buildGroup();
@@ -4477,11 +4717,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("groups"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4494,16 +4737,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroup());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4514,7 +4758,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.AdminApi(mock).groups;
       var arg_customer = "foo";
@@ -4527,11 +4770,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("groups"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4544,32 +4790,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customer"].first, unittest.equals(arg_customer));
+        unittest.expect(
+            queryMap["customer"].first, unittest.equals(arg_customer));
         unittest.expect(queryMap["domain"].first, unittest.equals(arg_domain));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["userKey"].first, unittest.equals(arg_userKey));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["userKey"].first, unittest.equals(arg_userKey));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroups());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(customer: arg_customer, domain: arg_domain, maxResults: arg_maxResults, pageToken: arg_pageToken, userKey: arg_userKey).then(unittest.expectAsync1(((api.Groups response) {
+      res
+          .list(
+              customer: arg_customer,
+              domain: arg_domain,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              userKey: arg_userKey)
+          .then(unittest.expectAsync1(((api.Groups response) {
         checkGroups(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.AdminApi(mock).groups;
       var arg_request = buildGroup();
@@ -4582,11 +4839,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4602,27 +4862,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroup());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_groupKey).then(unittest.expectAsync1(((api.Group response) {
+      res
+          .patch(arg_request, arg_groupKey)
+          .then(unittest.expectAsync1(((api.Group response) {
         checkGroup(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.AdminApi(mock).groups;
       var arg_request = buildGroup();
@@ -4635,11 +4897,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4655,31 +4920,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroup());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_groupKey).then(unittest.expectAsync1(((api.Group response) {
+      res
+          .update(arg_request, arg_groupKey)
+          .then(unittest.expectAsync1(((api.Group response) {
         checkGroup(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GroupsAliasesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.GroupsAliasesResourceApi res = new api.AdminApi(mock).groups.aliases;
       var arg_groupKey = "foo";
@@ -4689,18 +4954,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/aliases/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/aliases/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/aliases/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4716,16 +4986,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4734,7 +5005,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.GroupsAliasesResourceApi res = new api.AdminApi(mock).groups.aliases;
       var arg_request = buildAlias();
@@ -4747,18 +5017,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/aliases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/aliases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/aliases"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4771,27 +5046,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAlias());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_groupKey).then(unittest.expectAsync1(((api.Alias response) {
+      res
+          .insert(arg_request, arg_groupKey)
+          .then(unittest.expectAsync1(((api.Alias response) {
         checkAlias(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.GroupsAliasesResourceApi res = new api.AdminApi(mock).groups.aliases;
       var arg_groupKey = "foo";
@@ -4800,18 +5077,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/aliases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/aliases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/aliases"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4824,31 +5106,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAliases());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_groupKey).then(unittest.expectAsync1(((api.Aliases response) {
+      res
+          .list(arg_groupKey)
+          .then(unittest.expectAsync1(((api.Aliases response) {
         checkAliases(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MembersResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.MembersResourceApi res = new api.AdminApi(mock).members;
       var arg_groupKey = "foo";
@@ -4858,18 +5140,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/members/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/members/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4885,25 +5172,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_groupKey, arg_memberKey).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_groupKey, arg_memberKey)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.MembersResourceApi res = new api.AdminApi(mock).members;
       var arg_groupKey = "foo";
@@ -4913,18 +5202,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/members/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/members/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4940,27 +5234,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMember());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_groupKey, arg_memberKey).then(unittest.expectAsync1(((api.Member response) {
+      res
+          .get(arg_groupKey, arg_memberKey)
+          .then(unittest.expectAsync1(((api.Member response) {
         checkMember(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.MembersResourceApi res = new api.AdminApi(mock).members;
       var arg_request = buildMember();
@@ -4973,18 +5269,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/members"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/members"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4997,27 +5298,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMember());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_groupKey).then(unittest.expectAsync1(((api.Member response) {
+      res
+          .insert(arg_request, arg_groupKey)
+          .then(unittest.expectAsync1(((api.Member response) {
         checkMember(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.MembersResourceApi res = new api.AdminApi(mock).members;
       var arg_groupKey = "foo";
@@ -5029,18 +5332,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/members"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/members"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5053,30 +5361,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["roles"].first, unittest.equals(arg_roles));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMembers());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_groupKey, maxResults: arg_maxResults, pageToken: arg_pageToken, roles: arg_roles).then(unittest.expectAsync1(((api.Members response) {
+      res
+          .list(arg_groupKey,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              roles: arg_roles)
+          .then(unittest.expectAsync1(((api.Members response) {
         checkMembers(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.MembersResourceApi res = new api.AdminApi(mock).members;
       var arg_request = buildMember();
@@ -5090,18 +5405,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/members/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/members/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5117,27 +5437,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMember());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_groupKey, arg_memberKey).then(unittest.expectAsync1(((api.Member response) {
+      res
+          .patch(arg_request, arg_groupKey, arg_memberKey)
+          .then(unittest.expectAsync1(((api.Member response) {
         checkMember(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.MembersResourceApi res = new api.AdminApi(mock).members;
       var arg_request = buildMember();
@@ -5151,18 +5473,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/members/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/members/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5178,31 +5505,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMember());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_groupKey, arg_memberKey).then(unittest.expectAsync1(((api.Member response) {
+      res
+          .update(arg_request, arg_groupKey, arg_memberKey)
+          .then(unittest.expectAsync1(((api.Member response) {
         checkMember(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MobiledevicesResourceApi", () {
     unittest.test("method--action", () {
-
       var mock = new HttpServerMock();
       api.MobiledevicesResourceApi res = new api.AdminApi(mock).mobiledevices;
       var arg_request = buildMobileDeviceAction();
@@ -5216,25 +5543,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/devices/mobile/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/devices/mobile/"));
         pathOffset += 16;
         index = path.indexOf("/action", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/action"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/action"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -5247,25 +5581,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.action(arg_request, arg_customerId, arg_resourceId).then(unittest.expectAsync1((_) {}));
+      res
+          .action(arg_request, arg_customerId, arg_resourceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.MobiledevicesResourceApi res = new api.AdminApi(mock).mobiledevices;
       var arg_customerId = "foo";
@@ -5275,18 +5611,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/devices/mobile/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/devices/mobile/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5302,25 +5643,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customerId, arg_resourceId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customerId, arg_resourceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.MobiledevicesResourceApi res = new api.AdminApi(mock).mobiledevices;
       var arg_customerId = "foo";
@@ -5331,18 +5674,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/devices/mobile/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/devices/mobile/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5358,28 +5706,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileDevice());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerId, arg_resourceId, projection: arg_projection).then(unittest.expectAsync1(((api.MobileDevice response) {
+      res
+          .get(arg_customerId, arg_resourceId, projection: arg_projection)
+          .then(unittest.expectAsync1(((api.MobileDevice response) {
         checkMobileDevice(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.MobiledevicesResourceApi res = new api.AdminApi(mock).mobiledevices;
       var arg_customerId = "foo";
@@ -5394,18 +5745,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/devices/mobile"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/devices/mobile"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -5418,37 +5774,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
-        unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
-
+        unittest.expect(
+            queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileDevices());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customerId, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, projection: arg_projection, query: arg_query, sortOrder: arg_sortOrder).then(unittest.expectAsync1(((api.MobileDevices response) {
+      res
+          .list(arg_customerId,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken,
+              projection: arg_projection,
+              query: arg_query,
+              sortOrder: arg_sortOrder)
+          .then(unittest.expectAsync1(((api.MobileDevices response) {
         checkMobileDevices(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-NotificationsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.NotificationsResourceApi res = new api.AdminApi(mock).notifications;
       var arg_customer = "foo";
@@ -5458,18 +5825,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/notifications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/notifications/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5485,25 +5857,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customer, arg_notificationId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customer, arg_notificationId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.NotificationsResourceApi res = new api.AdminApi(mock).notifications;
       var arg_customer = "foo";
@@ -5513,18 +5887,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/notifications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/notifications/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5540,27 +5919,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNotification());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customer, arg_notificationId).then(unittest.expectAsync1(((api.Notification response) {
+      res
+          .get(arg_customer, arg_notificationId)
+          .then(unittest.expectAsync1(((api.Notification response) {
         checkNotification(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.NotificationsResourceApi res = new api.AdminApi(mock).notifications;
       var arg_customer = "foo";
@@ -5572,18 +5953,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/notifications"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/notifications"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -5596,30 +5982,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNotifications());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.Notifications response) {
+      res
+          .list(arg_customer,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.Notifications response) {
         checkNotifications(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.NotificationsResourceApi res = new api.AdminApi(mock).notifications;
       var arg_request = buildNotification();
@@ -5633,18 +6027,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/notifications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/notifications/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5660,27 +6059,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNotification());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customer, arg_notificationId).then(unittest.expectAsync1(((api.Notification response) {
+      res
+          .patch(arg_request, arg_customer, arg_notificationId)
+          .then(unittest.expectAsync1(((api.Notification response) {
         checkNotification(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.NotificationsResourceApi res = new api.AdminApi(mock).notifications;
       var arg_request = buildNotification();
@@ -5694,18 +6095,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/notifications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/notifications/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5721,54 +6127,64 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNotification());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customer, arg_notificationId).then(unittest.expectAsync1(((api.Notification response) {
+      res
+          .update(arg_request, arg_customer, arg_notificationId)
+          .then(unittest.expectAsync1(((api.Notification response) {
         checkNotification(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-OrgunitsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed842();
+      var arg_orgUnitPath = buildUnnamed845();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/orgunits"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/orgunits"));
         pathOffset += 9;
-        var parts = path.substring(pathOffset).split("/").map(core.Uri.decodeQueryComponent).where((p) => p.length > 0).toList();
+        var parts = path
+            .substring(pathOffset)
+            .split("/")
+            .map(core.Uri.decodeQueryComponent)
+            .where((p) => p.length > 0)
+            .toList();
         unittest.expect(parts, unittest.equals(arg_orgUnitPath));
 
         var query = (req.url).query;
@@ -5781,48 +6197,60 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customerId, arg_orgUnitPath).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customerId, arg_orgUnitPath)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed843();
+      var arg_orgUnitPath = buildUnnamed846();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/orgunits"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/orgunits"));
         pathOffset += 9;
-        var parts = path.substring(pathOffset).split("/").map(core.Uri.decodeQueryComponent).where((p) => p.length > 0).toList();
+        var parts = path
+            .substring(pathOffset)
+            .split("/")
+            .map(core.Uri.decodeQueryComponent)
+            .where((p) => p.length > 0)
+            .toList();
         unittest.expect(parts, unittest.equals(arg_orgUnitPath));
 
         var query = (req.url).query;
@@ -5835,27 +6263,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgUnit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerId, arg_orgUnitPath).then(unittest.expectAsync1(((api.OrgUnit response) {
+      res
+          .get(arg_customerId, arg_orgUnitPath)
+          .then(unittest.expectAsync1(((api.OrgUnit response) {
         checkOrgUnit(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
@@ -5868,18 +6298,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/orgunits"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/orgunits"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5892,27 +6327,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgUnit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customerId).then(unittest.expectAsync1(((api.OrgUnit response) {
+      res
+          .insert(arg_request, arg_customerId)
+          .then(unittest.expectAsync1(((api.OrgUnit response) {
         checkOrgUnit(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
@@ -5923,18 +6360,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/orgunits"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/orgunits"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5947,34 +6389,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["orgUnitPath"].first, unittest.equals(arg_orgUnitPath));
+        unittest.expect(
+            queryMap["orgUnitPath"].first, unittest.equals(arg_orgUnitPath));
         unittest.expect(queryMap["type"].first, unittest.equals(arg_type));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgUnits());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customerId, orgUnitPath: arg_orgUnitPath, type: arg_type).then(unittest.expectAsync1(((api.OrgUnits response) {
+      res
+          .list(arg_customerId, orgUnitPath: arg_orgUnitPath, type: arg_type)
+          .then(unittest.expectAsync1(((api.OrgUnits response) {
         checkOrgUnits(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed844();
+      var arg_orgUnitPath = buildUnnamed847();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -5983,20 +6428,30 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/orgunits"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/orgunits"));
         pathOffset += 9;
-        var parts = path.substring(pathOffset).split("/").map(core.Uri.decodeQueryComponent).where((p) => p.length > 0).toList();
+        var parts = path
+            .substring(pathOffset)
+            .split("/")
+            .map(core.Uri.decodeQueryComponent)
+            .where((p) => p.length > 0)
+            .toList();
         unittest.expect(parts, unittest.equals(arg_orgUnitPath));
 
         var query = (req.url).query;
@@ -6009,32 +6464,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgUnit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customerId, arg_orgUnitPath).then(unittest.expectAsync1(((api.OrgUnit response) {
+      res
+          .patch(arg_request, arg_customerId, arg_orgUnitPath)
+          .then(unittest.expectAsync1(((api.OrgUnit response) {
         checkOrgUnit(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed845();
+      var arg_orgUnitPath = buildUnnamed848();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -6043,20 +6500,30 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/orgunits"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/orgunits"));
         pathOffset += 9;
-        var parts = path.substring(pathOffset).split("/").map(core.Uri.decodeQueryComponent).where((p) => p.length > 0).toList();
+        var parts = path
+            .substring(pathOffset)
+            .split("/")
+            .map(core.Uri.decodeQueryComponent)
+            .where((p) => p.length > 0)
+            .toList();
         unittest.expect(parts, unittest.equals(arg_orgUnitPath));
 
         var query = (req.url).query;
@@ -6069,31 +6536,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgUnit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customerId, arg_orgUnitPath).then(unittest.expectAsync1(((api.OrgUnit response) {
+      res
+          .update(arg_request, arg_customerId, arg_orgUnitPath)
+          .then(unittest.expectAsync1(((api.OrgUnit response) {
         checkOrgUnit(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PrivilegesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PrivilegesResourceApi res = new api.AdminApi(mock).privileges;
       var arg_customer = "foo";
@@ -6102,18 +6569,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles/ALL/privileges", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/roles/ALL/privileges"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/roles/ALL/privileges"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -6126,33 +6598,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPrivileges());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer).then(unittest.expectAsync1(((api.Privileges response) {
+      res
+          .list(arg_customer)
+          .then(unittest.expectAsync1(((api.Privileges response) {
         checkPrivileges(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ResourcesCalendarsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesCalendarsResourceApi res = new api.AdminApi(mock).resources.calendars;
+      api.ResourcesCalendarsResourceApi res =
+          new api.AdminApi(mock).resources.calendars;
       var arg_customer = "foo";
       var arg_calendarResourceId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6160,18 +6633,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/resources/calendars/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/resources/calendars/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/calendars/"));
         pathOffset += 21;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6187,27 +6665,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customer, arg_calendarResourceId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customer, arg_calendarResourceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesCalendarsResourceApi res = new api.AdminApi(mock).resources.calendars;
+      api.ResourcesCalendarsResourceApi res =
+          new api.AdminApi(mock).resources.calendars;
       var arg_customer = "foo";
       var arg_calendarResourceId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6215,18 +6696,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/resources/calendars/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/resources/calendars/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/calendars/"));
         pathOffset += 21;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6242,29 +6728,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCalendarResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customer, arg_calendarResourceId).then(unittest.expectAsync1(((api.CalendarResource response) {
+      res
+          .get(arg_customer, arg_calendarResourceId)
+          .then(unittest.expectAsync1(((api.CalendarResource response) {
         checkCalendarResource(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesCalendarsResourceApi res = new api.AdminApi(mock).resources.calendars;
+      api.ResourcesCalendarsResourceApi res =
+          new api.AdminApi(mock).resources.calendars;
       var arg_request = buildCalendarResource();
       var arg_customer = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6275,18 +6764,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/resources/calendars", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/resources/calendars"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/calendars"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -6299,29 +6793,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCalendarResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customer).then(unittest.expectAsync1(((api.CalendarResource response) {
+      res
+          .insert(arg_request, arg_customer)
+          .then(unittest.expectAsync1(((api.CalendarResource response) {
         checkCalendarResource(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesCalendarsResourceApi res = new api.AdminApi(mock).resources.calendars;
+      api.ResourcesCalendarsResourceApi res =
+          new api.AdminApi(mock).resources.calendars;
       var arg_customer = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -6330,18 +6827,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/resources/calendars", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/resources/calendars"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/resources/calendars"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -6354,31 +6856,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCalendarResources());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.CalendarResources response) {
+      res
+          .list(arg_customer,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.CalendarResources response) {
         checkCalendarResources(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesCalendarsResourceApi res = new api.AdminApi(mock).resources.calendars;
+      api.ResourcesCalendarsResourceApi res =
+          new api.AdminApi(mock).resources.calendars;
       var arg_request = buildCalendarResource();
       var arg_customer = "foo";
       var arg_calendarResourceId = "foo";
@@ -6390,18 +6898,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/resources/calendars/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/resources/calendars/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/calendars/"));
         pathOffset += 21;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6417,29 +6930,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCalendarResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customer, arg_calendarResourceId).then(unittest.expectAsync1(((api.CalendarResource response) {
+      res
+          .patch(arg_request, arg_customer, arg_calendarResourceId)
+          .then(unittest.expectAsync1(((api.CalendarResource response) {
         checkCalendarResource(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesCalendarsResourceApi res = new api.AdminApi(mock).resources.calendars;
+      api.ResourcesCalendarsResourceApi res =
+          new api.AdminApi(mock).resources.calendars;
       var arg_request = buildCalendarResource();
       var arg_customer = "foo";
       var arg_calendarResourceId = "foo";
@@ -6451,18 +6967,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/resources/calendars/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/resources/calendars/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/resources/calendars/"));
         pathOffset += 21;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6478,33 +6999,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCalendarResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customer, arg_calendarResourceId).then(unittest.expectAsync1(((api.CalendarResource response) {
+      res
+          .update(arg_request, arg_customer, arg_calendarResourceId)
+          .then(unittest.expectAsync1(((api.CalendarResource response) {
         checkCalendarResource(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RoleAssignmentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.RoleAssignmentsResourceApi res = new api.AdminApi(mock).roleAssignments;
+      api.RoleAssignmentsResourceApi res =
+          new api.AdminApi(mock).roleAssignments;
       var arg_customer = "foo";
       var arg_roleAssignmentId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6512,18 +7034,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roleassignments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/roleassignments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/roleassignments/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6539,27 +7066,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customer, arg_roleAssignmentId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customer, arg_roleAssignmentId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RoleAssignmentsResourceApi res = new api.AdminApi(mock).roleAssignments;
+      api.RoleAssignmentsResourceApi res =
+          new api.AdminApi(mock).roleAssignments;
       var arg_customer = "foo";
       var arg_roleAssignmentId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6567,18 +7097,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roleassignments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/roleassignments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/roleassignments/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6594,29 +7129,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoleAssignment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customer, arg_roleAssignmentId).then(unittest.expectAsync1(((api.RoleAssignment response) {
+      res
+          .get(arg_customer, arg_roleAssignmentId)
+          .then(unittest.expectAsync1(((api.RoleAssignment response) {
         checkRoleAssignment(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.RoleAssignmentsResourceApi res = new api.AdminApi(mock).roleAssignments;
+      api.RoleAssignmentsResourceApi res =
+          new api.AdminApi(mock).roleAssignments;
       var arg_request = buildRoleAssignment();
       var arg_customer = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6627,18 +7165,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roleassignments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/roleassignments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/roleassignments"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -6651,29 +7194,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoleAssignment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customer).then(unittest.expectAsync1(((api.RoleAssignment response) {
+      res
+          .insert(arg_request, arg_customer)
+          .then(unittest.expectAsync1(((api.RoleAssignment response) {
         checkRoleAssignment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RoleAssignmentsResourceApi res = new api.AdminApi(mock).roleAssignments;
+      api.RoleAssignmentsResourceApi res =
+          new api.AdminApi(mock).roleAssignments;
       var arg_customer = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -6684,18 +7230,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roleassignments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/roleassignments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/roleassignments"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -6708,35 +7259,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["roleId"].first, unittest.equals(arg_roleId));
-        unittest.expect(queryMap["userKey"].first, unittest.equals(arg_userKey));
-
+        unittest.expect(
+            queryMap["userKey"].first, unittest.equals(arg_userKey));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoleAssignments());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer, maxResults: arg_maxResults, pageToken: arg_pageToken, roleId: arg_roleId, userKey: arg_userKey).then(unittest.expectAsync1(((api.RoleAssignments response) {
+      res
+          .list(arg_customer,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              roleId: arg_roleId,
+              userKey: arg_userKey)
+          .then(unittest.expectAsync1(((api.RoleAssignments response) {
         checkRoleAssignments(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RolesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RolesResourceApi res = new api.AdminApi(mock).roles;
       var arg_customer = "foo";
@@ -6746,18 +7304,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/roles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/roles/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6773,16 +7336,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -6791,7 +7355,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RolesResourceApi res = new api.AdminApi(mock).roles;
       var arg_customer = "foo";
@@ -6801,18 +7364,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/roles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/roles/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6828,27 +7396,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRole());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customer, arg_roleId).then(unittest.expectAsync1(((api.Role response) {
+      res
+          .get(arg_customer, arg_roleId)
+          .then(unittest.expectAsync1(((api.Role response) {
         checkRole(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.RolesResourceApi res = new api.AdminApi(mock).roles;
       var arg_request = buildRole();
@@ -6861,18 +7431,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/roles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/roles"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -6885,27 +7460,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRole());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customer).then(unittest.expectAsync1(((api.Role response) {
+      res
+          .insert(arg_request, arg_customer)
+          .then(unittest.expectAsync1(((api.Role response) {
         checkRole(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RolesResourceApi res = new api.AdminApi(mock).roles;
       var arg_customer = "foo";
@@ -6916,18 +7493,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/roles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/roles"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -6940,29 +7522,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoles());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customer, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.Roles response) {
+      res
+          .list(arg_customer,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.Roles response) {
         checkRoles(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.RolesResourceApi res = new api.AdminApi(mock).roles;
       var arg_request = buildRole();
@@ -6976,18 +7563,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/roles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/roles/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7003,27 +7595,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRole());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customer, arg_roleId).then(unittest.expectAsync1(((api.Role response) {
+      res
+          .patch(arg_request, arg_customer, arg_roleId)
+          .then(unittest.expectAsync1(((api.Role response) {
         checkRole(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.RolesResourceApi res = new api.AdminApi(mock).roles;
       var arg_request = buildRole();
@@ -7037,18 +7631,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/roles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customer"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/roles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/roles/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7064,31 +7663,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRole());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customer, arg_roleId).then(unittest.expectAsync1(((api.Role response) {
+      res
+          .update(arg_request, arg_customer, arg_roleId)
+          .then(unittest.expectAsync1(((api.Role response) {
         checkRole(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SchemasResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
       var arg_customerId = "foo";
@@ -7098,18 +7697,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/schemas/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/schemas/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7125,25 +7729,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customerId, arg_schemaKey).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customerId, arg_schemaKey)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
       var arg_customerId = "foo";
@@ -7153,18 +7759,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/schemas/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/schemas/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7180,27 +7791,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSchema());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerId, arg_schemaKey).then(unittest.expectAsync1(((api.Schema response) {
+      res
+          .get(arg_customerId, arg_schemaKey)
+          .then(unittest.expectAsync1(((api.Schema response) {
         checkSchema(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
       var arg_request = buildSchema();
@@ -7213,18 +7826,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/schemas", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/schemas"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/schemas"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7237,27 +7855,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSchema());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customerId).then(unittest.expectAsync1(((api.Schema response) {
+      res
+          .insert(arg_request, arg_customerId)
+          .then(unittest.expectAsync1(((api.Schema response) {
         checkSchema(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
       var arg_customerId = "foo";
@@ -7266,18 +7886,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/schemas", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/schemas"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/schemas"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7290,27 +7915,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSchemas());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_customerId).then(unittest.expectAsync1(((api.Schemas response) {
+      res
+          .list(arg_customerId)
+          .then(unittest.expectAsync1(((api.Schemas response) {
         checkSchemas(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
       var arg_request = buildSchema();
@@ -7324,18 +7951,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/schemas/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/schemas/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7351,27 +7983,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSchema());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customerId, arg_schemaKey).then(unittest.expectAsync1(((api.Schema response) {
+      res
+          .patch(arg_request, arg_customerId, arg_schemaKey)
+          .then(unittest.expectAsync1(((api.Schema response) {
         checkSchema(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
       var arg_request = buildSchema();
@@ -7385,18 +8019,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/schemas/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/schemas/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7412,31 +8051,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSchema());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customerId, arg_schemaKey).then(unittest.expectAsync1(((api.Schema response) {
+      res
+          .update(arg_request, arg_customerId, arg_schemaKey)
+          .then(unittest.expectAsync1(((api.Schema response) {
         checkSchema(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TokensResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TokensResourceApi res = new api.AdminApi(mock).tokens;
       var arg_userKey = "foo";
@@ -7446,18 +8085,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/tokens/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tokens/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/tokens/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7473,16 +8117,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -7491,7 +8136,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TokensResourceApi res = new api.AdminApi(mock).tokens;
       var arg_userKey = "foo";
@@ -7501,18 +8145,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/tokens/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tokens/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/tokens/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7528,27 +8177,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userKey, arg_clientId).then(unittest.expectAsync1(((api.Token response) {
+      res
+          .get(arg_userKey, arg_clientId)
+          .then(unittest.expectAsync1(((api.Token response) {
         checkToken(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TokensResourceApi res = new api.AdminApi(mock).tokens;
       var arg_userKey = "foo";
@@ -7557,18 +8208,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/tokens", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tokens"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tokens"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -7581,16 +8237,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTokens());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -7599,13 +8256,10 @@
         checkTokens(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UsersResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_userKey = "foo";
@@ -7614,11 +8268,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7634,16 +8291,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -7652,7 +8310,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_userKey = "foo";
@@ -7664,11 +8321,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7684,30 +8344,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customFieldMask"].first, unittest.equals(arg_customFieldMask));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-        unittest.expect(queryMap["viewType"].first, unittest.equals(arg_viewType));
-
+        unittest.expect(queryMap["customFieldMask"].first,
+            unittest.equals(arg_customFieldMask));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(
+            queryMap["viewType"].first, unittest.equals(arg_viewType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userKey, customFieldMask: arg_customFieldMask, projection: arg_projection, viewType: arg_viewType).then(unittest.expectAsync1(((api.User response) {
+      res
+          .get(arg_userKey,
+              customFieldMask: arg_customFieldMask,
+              projection: arg_projection,
+              viewType: arg_viewType)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildUser();
@@ -7719,11 +8387,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("users"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("users"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -7736,16 +8407,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -7756,7 +8428,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_customFieldMask = "foo";
@@ -7776,11 +8447,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("users"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("users"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -7793,39 +8467,62 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customFieldMask"].first, unittest.equals(arg_customFieldMask));
-        unittest.expect(queryMap["customer"].first, unittest.equals(arg_customer));
+        unittest.expect(queryMap["customFieldMask"].first,
+            unittest.equals(arg_customFieldMask));
+        unittest.expect(
+            queryMap["customer"].first, unittest.equals(arg_customer));
         unittest.expect(queryMap["domain"].first, unittest.equals(arg_domain));
         unittest.expect(queryMap["event"].first, unittest.equals(arg_event));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
-        unittest.expect(queryMap["showDeleted"].first, unittest.equals(arg_showDeleted));
-        unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
-        unittest.expect(queryMap["viewType"].first, unittest.equals(arg_viewType));
-
+        unittest.expect(
+            queryMap["showDeleted"].first, unittest.equals(arg_showDeleted));
+        unittest.expect(
+            queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
+        unittest.expect(
+            queryMap["viewType"].first, unittest.equals(arg_viewType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUsers());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(customFieldMask: arg_customFieldMask, customer: arg_customer, domain: arg_domain, event: arg_event, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, projection: arg_projection, query: arg_query, showDeleted: arg_showDeleted, sortOrder: arg_sortOrder, viewType: arg_viewType).then(unittest.expectAsync1(((api.Users response) {
+      res
+          .list(
+              customFieldMask: arg_customFieldMask,
+              customer: arg_customer,
+              domain: arg_domain,
+              event: arg_event,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken,
+              projection: arg_projection,
+              query: arg_query,
+              showDeleted: arg_showDeleted,
+              sortOrder: arg_sortOrder,
+              viewType: arg_viewType)
+          .then(unittest.expectAsync1(((api.Users response) {
         checkUsers(response);
       })));
     });
 
     unittest.test("method--makeAdmin", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildUserMakeAdmin();
@@ -7838,18 +8535,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/makeAdmin", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/makeAdmin"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/makeAdmin"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -7862,25 +8564,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.makeAdmin(arg_request, arg_userKey).then(unittest.expectAsync1((_) {}));
+      res
+          .makeAdmin(arg_request, arg_userKey)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildUser();
@@ -7893,11 +8597,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7913,27 +8620,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_userKey).then(unittest.expectAsync1(((api.User response) {
+      res
+          .patch(arg_request, arg_userKey)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
 
     unittest.test("method--undelete", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildUserUndelete();
@@ -7946,18 +8655,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/undelete", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/undelete"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/undelete"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -7970,25 +8684,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.undelete(arg_request, arg_userKey).then(unittest.expectAsync1((_) {}));
+      res
+          .undelete(arg_request, arg_userKey)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildUser();
@@ -8001,11 +8717,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8021,27 +8740,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_userKey).then(unittest.expectAsync1(((api.User response) {
+      res
+          .update(arg_request, arg_userKey)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
 
     unittest.test("method--watch", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildChannel();
@@ -8065,11 +8786,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("users/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("users/watch"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -8082,43 +8806,64 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customFieldMask"].first, unittest.equals(arg_customFieldMask));
-        unittest.expect(queryMap["customer"].first, unittest.equals(arg_customer));
+        unittest.expect(queryMap["customFieldMask"].first,
+            unittest.equals(arg_customFieldMask));
+        unittest.expect(
+            queryMap["customer"].first, unittest.equals(arg_customer));
         unittest.expect(queryMap["domain"].first, unittest.equals(arg_domain));
         unittest.expect(queryMap["event"].first, unittest.equals(arg_event));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
-        unittest.expect(queryMap["showDeleted"].first, unittest.equals(arg_showDeleted));
-        unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
-        unittest.expect(queryMap["viewType"].first, unittest.equals(arg_viewType));
-
+        unittest.expect(
+            queryMap["showDeleted"].first, unittest.equals(arg_showDeleted));
+        unittest.expect(
+            queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
+        unittest.expect(
+            queryMap["viewType"].first, unittest.equals(arg_viewType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, customFieldMask: arg_customFieldMask, customer: arg_customer, domain: arg_domain, event: arg_event, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, projection: arg_projection, query: arg_query, showDeleted: arg_showDeleted, sortOrder: arg_sortOrder, viewType: arg_viewType).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request,
+              customFieldMask: arg_customFieldMask,
+              customer: arg_customer,
+              domain: arg_domain,
+              event: arg_event,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken,
+              projection: arg_projection,
+              query: arg_query,
+              showDeleted: arg_showDeleted,
+              sortOrder: arg_sortOrder,
+              viewType: arg_viewType)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UsersAliasesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.UsersAliasesResourceApi res = new api.AdminApi(mock).users.aliases;
       var arg_userKey = "foo";
@@ -8128,18 +8873,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/aliases/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/aliases/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8155,16 +8905,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -8173,7 +8924,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.UsersAliasesResourceApi res = new api.AdminApi(mock).users.aliases;
       var arg_request = buildAlias();
@@ -8186,18 +8936,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/aliases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/aliases"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8210,27 +8965,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAlias());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_userKey).then(unittest.expectAsync1(((api.Alias response) {
+      res
+          .insert(arg_request, arg_userKey)
+          .then(unittest.expectAsync1(((api.Alias response) {
         checkAlias(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.UsersAliasesResourceApi res = new api.AdminApi(mock).users.aliases;
       var arg_userKey = "foo";
@@ -8240,18 +8997,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/aliases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/aliases"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8264,28 +9026,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["event"].first, unittest.equals(arg_event));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAliases());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_userKey, event: arg_event).then(unittest.expectAsync1(((api.Aliases response) {
+      res
+          .list(arg_userKey, event: arg_event)
+          .then(unittest.expectAsync1(((api.Aliases response) {
         checkAliases(response);
       })));
     });
 
     unittest.test("method--watch", () {
-
       var mock = new HttpServerMock();
       api.UsersAliasesResourceApi res = new api.AdminApi(mock).users.aliases;
       var arg_request = buildChannel();
@@ -8299,18 +9063,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases/watch", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/aliases/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/aliases/watch"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -8323,32 +9092,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["event"].first, unittest.equals(arg_event));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, arg_userKey, event: arg_event).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request, arg_userKey, event: arg_event)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UsersPhotosResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.UsersPhotosResourceApi res = new api.AdminApi(mock).users.photos;
       var arg_userKey = "foo";
@@ -8357,18 +9126,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/photos/thumbnail"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/photos/thumbnail"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -8381,16 +9155,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -8399,7 +9174,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UsersPhotosResourceApi res = new api.AdminApi(mock).users.photos;
       var arg_userKey = "foo";
@@ -8408,18 +9182,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/photos/thumbnail"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/photos/thumbnail"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -8432,27 +9211,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUserPhoto());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userKey).then(unittest.expectAsync1(((api.UserPhoto response) {
+      res
+          .get(arg_userKey)
+          .then(unittest.expectAsync1(((api.UserPhoto response) {
         checkUserPhoto(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.UsersPhotosResourceApi res = new api.AdminApi(mock).users.photos;
       var arg_request = buildUserPhoto();
@@ -8465,18 +9246,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/photos/thumbnail"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/photos/thumbnail"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -8489,27 +9275,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUserPhoto());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_userKey).then(unittest.expectAsync1(((api.UserPhoto response) {
+      res
+          .patch(arg_request, arg_userKey)
+          .then(unittest.expectAsync1(((api.UserPhoto response) {
         checkUserPhoto(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.UsersPhotosResourceApi res = new api.AdminApi(mock).users.photos;
       var arg_request = buildUserPhoto();
@@ -8522,18 +9310,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/photos/thumbnail"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/photos/thumbnail"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -8546,51 +9339,57 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUserPhoto());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_userKey).then(unittest.expectAsync1(((api.UserPhoto response) {
+      res
+          .update(arg_request, arg_userKey)
+          .then(unittest.expectAsync1(((api.UserPhoto response) {
         checkUserPhoto(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VerificationCodesResourceApi", () {
     unittest.test("method--generate", () {
-
       var mock = new HttpServerMock();
-      api.VerificationCodesResourceApi res = new api.AdminApi(mock).verificationCodes;
+      api.VerificationCodesResourceApi res =
+          new api.AdminApi(mock).verificationCodes;
       var arg_userKey = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/verificationCodes/generate", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/verificationCodes/generate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 27),
+            unittest.equals("/verificationCodes/generate"));
         pathOffset += 27;
 
         var query = (req.url).query;
@@ -8603,16 +9402,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -8621,27 +9421,32 @@
     });
 
     unittest.test("method--invalidate", () {
-
       var mock = new HttpServerMock();
-      api.VerificationCodesResourceApi res = new api.AdminApi(mock).verificationCodes;
+      api.VerificationCodesResourceApi res =
+          new api.AdminApi(mock).verificationCodes;
       var arg_userKey = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/verificationCodes/invalidate", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 29), unittest.equals("/verificationCodes/invalidate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 29),
+            unittest.equals("/verificationCodes/invalidate"));
         pathOffset += 29;
 
         var query = (req.url).query;
@@ -8654,16 +9459,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -8672,27 +9478,32 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.VerificationCodesResourceApi res = new api.AdminApi(mock).verificationCodes;
+      api.VerificationCodesResourceApi res =
+          new api.AdminApi(mock).verificationCodes;
       var arg_userKey = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("admin/directory/v1/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/verificationCodes", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/verificationCodes"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/verificationCodes"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -8705,27 +9516,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVerificationCodes());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_userKey).then(unittest.expectAsync1(((api.VerificationCodes response) {
+      res
+          .list(arg_userKey)
+          .then(unittest.expectAsync1(((api.VerificationCodes response) {
         checkVerificationCodes(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index 948d03a..6826025 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.admin.reports_v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/admin/reports_v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed691() {
+buildUnnamed690() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed691(core.List<api.Activity> o) {
+checkUnnamed690(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -70,7 +69,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed691();
+    o.items = buildUnnamed690();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -82,7 +81,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed691(o.items);
+    checkUnnamed690(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -114,6 +113,19 @@
   buildCounterActivityActor--;
 }
 
+buildUnnamed691() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed691(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed692() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -127,19 +139,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed693() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed693(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterActivityEventsParameters = 0;
 buildActivityEventsParameters() {
   var o = new api.ActivityEventsParameters();
@@ -147,8 +146,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     o.boolValue = true;
     o.intValue = "foo";
-    o.multiIntValue = buildUnnamed692();
-    o.multiValue = buildUnnamed693();
+    o.multiIntValue = buildUnnamed691();
+    o.multiValue = buildUnnamed692();
     o.name = "foo";
     o.value = "foo";
   }
@@ -161,22 +160,22 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed692(o.multiIntValue);
-    checkUnnamed693(o.multiValue);
+    checkUnnamed691(o.multiIntValue);
+    checkUnnamed692(o.multiValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterActivityEventsParameters--;
 }
 
-buildUnnamed694() {
+buildUnnamed693() {
   var o = new core.List<api.ActivityEventsParameters>();
   o.add(buildActivityEventsParameters());
   o.add(buildActivityEventsParameters());
   return o;
 }
 
-checkUnnamed694(core.List<api.ActivityEventsParameters> o) {
+checkUnnamed693(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEventsParameters(o[0]);
   checkActivityEventsParameters(o[1]);
@@ -188,7 +187,7 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     o.name = "foo";
-    o.parameters = buildUnnamed694();
+    o.parameters = buildUnnamed693();
     o.type = "foo";
   }
   buildCounterActivityEvents--;
@@ -199,20 +198,20 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed694(o.parameters);
+    checkUnnamed693(o.parameters);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityEvents--;
 }
 
-buildUnnamed695() {
+buildUnnamed694() {
   var o = new core.List<api.ActivityEvents>();
   o.add(buildActivityEvents());
   o.add(buildActivityEvents());
   return o;
 }
 
-checkUnnamed695(core.List<api.ActivityEvents> o) {
+checkUnnamed694(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEvents(o[0]);
   checkActivityEvents(o[1]);
@@ -237,7 +236,8 @@
   if (buildCounterActivityId < 3) {
     unittest.expect(o.applicationName, unittest.equals('foo'));
     unittest.expect(o.customerId, unittest.equals('foo'));
-    unittest.expect(o.time, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.time, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.uniqueQualifier, unittest.equals('foo'));
   }
   buildCounterActivityId--;
@@ -250,7 +250,7 @@
   if (buildCounterActivity < 3) {
     o.actor = buildActivityActor();
     o.etag = "foo";
-    o.events = buildUnnamed695();
+    o.events = buildUnnamed694();
     o.id = buildActivityId();
     o.ipAddress = "foo";
     o.kind = "foo";
@@ -265,7 +265,7 @@
   if (buildCounterActivity < 3) {
     checkActivityActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed695(o.events);
+    checkUnnamed694(o.events);
     checkActivityId(o.id);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -274,14 +274,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed696() {
+buildUnnamed695() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed696(core.Map<core.String, core.String> o) {
+checkUnnamed695(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -296,7 +296,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed696();
+    o.params = buildUnnamed695();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -314,7 +314,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed696(o.params);
+    checkUnnamed695(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -349,30 +349,46 @@
   buildCounterUsageReportEntity--;
 }
 
-buildUnnamed697() {
+buildUnnamed696() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed697(core.Map<core.String, core.Object> o) {
+checkUnnamed696(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed698() {
+buildUnnamed697() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed697());
-  o.add(buildUnnamed697());
+  o.add(buildUnnamed696());
+  o.add(buildUnnamed696());
   return o;
 }
 
-checkUnnamed698(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed697(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed697(o[0]);
-  checkUnnamed697(o[1]);
+  checkUnnamed696(o[0]);
+  checkUnnamed696(o[1]);
 }
 
 core.int buildCounterUsageReportParameters = 0;
@@ -383,7 +399,7 @@
     o.boolValue = true;
     o.datetimeValue = core.DateTime.parse("2002-02-27T14:01:02");
     o.intValue = "foo";
-    o.msgValue = buildUnnamed698();
+    o.msgValue = buildUnnamed697();
     o.name = "foo";
     o.stringValue = "foo";
   }
@@ -395,23 +411,24 @@
   buildCounterUsageReportParameters++;
   if (buildCounterUsageReportParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
-    unittest.expect(o.datetimeValue, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.datetimeValue,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed698(o.msgValue);
+    checkUnnamed697(o.msgValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterUsageReportParameters--;
 }
 
-buildUnnamed699() {
+buildUnnamed698() {
   var o = new core.List<api.UsageReportParameters>();
   o.add(buildUsageReportParameters());
   o.add(buildUsageReportParameters());
   return o;
 }
 
-checkUnnamed699(core.List<api.UsageReportParameters> o) {
+checkUnnamed698(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportParameters(o[0]);
   checkUsageReportParameters(o[1]);
@@ -426,7 +443,7 @@
     o.entity = buildUsageReportEntity();
     o.etag = "foo";
     o.kind = "foo";
-    o.parameters = buildUnnamed699();
+    o.parameters = buildUnnamed698();
   }
   buildCounterUsageReport--;
   return o;
@@ -439,19 +456,19 @@
     checkUsageReportEntity(o.entity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed699(o.parameters);
+    checkUnnamed698(o.parameters);
   }
   buildCounterUsageReport--;
 }
 
-buildUnnamed700() {
+buildUnnamed699() {
   var o = new core.List<api.UsageReport>();
   o.add(buildUsageReport());
   o.add(buildUsageReport());
   return o;
 }
 
-checkUnnamed700(core.List<api.UsageReport> o) {
+checkUnnamed699(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReport(o[0]);
   checkUsageReport(o[1]);
@@ -478,14 +495,14 @@
   buildCounterUsageReportsWarningsData--;
 }
 
-buildUnnamed701() {
+buildUnnamed700() {
   var o = new core.List<api.UsageReportsWarningsData>();
   o.add(buildUsageReportsWarningsData());
   o.add(buildUsageReportsWarningsData());
   return o;
 }
 
-checkUnnamed701(core.List<api.UsageReportsWarningsData> o) {
+checkUnnamed700(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarningsData(o[0]);
   checkUsageReportsWarningsData(o[1]);
@@ -497,7 +514,7 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed701();
+    o.data = buildUnnamed700();
     o.message = "foo";
   }
   buildCounterUsageReportsWarnings--;
@@ -508,20 +525,20 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed701(o.data);
+    checkUnnamed700(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUsageReportsWarnings--;
 }
 
-buildUnnamed702() {
+buildUnnamed701() {
   var o = new core.List<api.UsageReportsWarnings>();
   o.add(buildUsageReportsWarnings());
   o.add(buildUsageReportsWarnings());
   return o;
 }
 
-checkUnnamed702(core.List<api.UsageReportsWarnings> o) {
+checkUnnamed701(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarnings(o[0]);
   checkUsageReportsWarnings(o[1]);
@@ -535,8 +552,8 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.usageReports = buildUnnamed700();
-    o.warnings = buildUnnamed702();
+    o.usageReports = buildUnnamed699();
+    o.warnings = buildUnnamed701();
   }
   buildCounterUsageReports--;
   return o;
@@ -548,13 +565,12 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed700(o.usageReports);
-    checkUnnamed702(o.warnings);
+    checkUnnamed699(o.usageReports);
+    checkUnnamed701(o.warnings);
   }
   buildCounterUsageReports--;
 }
 
-
 main() {
   unittest.group("obj-schema-Activities", () {
     unittest.test("to-json--from-json", () {
@@ -564,7 +580,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityActor", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActor();
@@ -573,7 +588,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityEventsParameters", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityEventsParameters();
@@ -582,7 +596,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityEvents", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityEvents();
@@ -591,7 +604,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityId", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityId();
@@ -600,7 +612,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Activity", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivity();
@@ -609,7 +620,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Channel", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannel();
@@ -618,7 +628,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageReportEntity", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageReportEntity();
@@ -627,7 +636,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageReportParameters", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageReportParameters();
@@ -636,7 +644,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageReport", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageReport();
@@ -645,7 +652,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageReportsWarningsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageReportsWarningsData();
@@ -654,7 +660,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageReportsWarnings", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageReportsWarnings();
@@ -663,7 +668,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageReports", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageReports();
@@ -672,10 +676,8 @@
     });
   });
 
-
   unittest.group("resource-ActivitiesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.AdminApi(mock).activities;
       var arg_userKey = "foo";
@@ -693,18 +695,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("admin/reports/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("activity/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("activity/users/"));
         pathOffset += 15;
         index = path.indexOf("/applications/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/applications/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -720,35 +727,53 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["actorIpAddress"].first, unittest.equals(arg_actorIpAddress));
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(queryMap["endTime"].first, unittest.equals(arg_endTime));
-        unittest.expect(queryMap["eventName"].first, unittest.equals(arg_eventName));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["startTime"].first, unittest.equals(arg_startTime));
-
+        unittest.expect(queryMap["actorIpAddress"].first,
+            unittest.equals(arg_actorIpAddress));
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(
+            queryMap["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(
+            queryMap["eventName"].first, unittest.equals(arg_eventName));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["startTime"].first, unittest.equals(arg_startTime));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildActivities());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_userKey, arg_applicationName, actorIpAddress: arg_actorIpAddress, customerId: arg_customerId, endTime: arg_endTime, eventName: arg_eventName, filters: arg_filters, maxResults: arg_maxResults, pageToken: arg_pageToken, startTime: arg_startTime).then(unittest.expectAsync1(((api.Activities response) {
+      res
+          .list(arg_userKey, arg_applicationName,
+              actorIpAddress: arg_actorIpAddress,
+              customerId: arg_customerId,
+              endTime: arg_endTime,
+              eventName: arg_eventName,
+              filters: arg_filters,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              startTime: arg_startTime)
+          .then(unittest.expectAsync1(((api.Activities response) {
         checkActivities(response);
       })));
     });
 
     unittest.test("method--watch", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.AdminApi(mock).activities;
       var arg_request = buildChannel();
@@ -770,25 +795,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("admin/reports/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("activity/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("activity/users/"));
         pathOffset += 15;
         index = path.indexOf("/applications/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/applications/"));
         pathOffset += 14;
         index = path.indexOf("/watch", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/watch"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -801,39 +833,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["actorIpAddress"].first, unittest.equals(arg_actorIpAddress));
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(queryMap["endTime"].first, unittest.equals(arg_endTime));
-        unittest.expect(queryMap["eventName"].first, unittest.equals(arg_eventName));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["startTime"].first, unittest.equals(arg_startTime));
-
+        unittest.expect(queryMap["actorIpAddress"].first,
+            unittest.equals(arg_actorIpAddress));
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(
+            queryMap["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(
+            queryMap["eventName"].first, unittest.equals(arg_eventName));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["startTime"].first, unittest.equals(arg_startTime));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, arg_userKey, arg_applicationName, actorIpAddress: arg_actorIpAddress, customerId: arg_customerId, endTime: arg_endTime, eventName: arg_eventName, filters: arg_filters, maxResults: arg_maxResults, pageToken: arg_pageToken, startTime: arg_startTime).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request, arg_userKey, arg_applicationName,
+              actorIpAddress: arg_actorIpAddress,
+              customerId: arg_customerId,
+              endTime: arg_endTime,
+              eventName: arg_eventName,
+              filters: arg_filters,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              startTime: arg_startTime)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelsResourceApi", () {
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.ChannelsResourceApi res = new api.AdminApi(mock).channels;
       var arg_request = buildChannel();
@@ -845,9 +893,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("admin/reports_v1/channels/stop"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("admin/reports_v1/channels/stop"));
         pathOffset += 30;
 
         var query = (req.url).query;
@@ -860,31 +910,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.stop(arg_request).then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-CustomerUsageReportsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.CustomerUsageReportsResourceApi res = new api.AdminApi(mock).customerUsageReports;
+      api.CustomerUsageReportsResourceApi res =
+          new api.AdminApi(mock).customerUsageReports;
       var arg_date = "foo";
       var arg_customerId = "foo";
       var arg_pageToken = "foo";
@@ -894,11 +943,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("admin/reports/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("usage/dates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("usage/dates/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -914,36 +966,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["parameters"].first, unittest.equals(arg_parameters));
-
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["parameters"].first, unittest.equals(arg_parameters));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUsageReports());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_date, customerId: arg_customerId, pageToken: arg_pageToken, parameters: arg_parameters).then(unittest.expectAsync1(((api.UsageReports response) {
+      res
+          .get(arg_date,
+              customerId: arg_customerId,
+              pageToken: arg_pageToken,
+              parameters: arg_parameters)
+          .then(unittest.expectAsync1(((api.UsageReports response) {
         checkUsageReports(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UserUsageReportResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.UserUsageReportResourceApi res = new api.AdminApi(mock).userUsageReport;
+      api.UserUsageReportResourceApi res =
+          new api.AdminApi(mock).userUsageReport;
       var arg_userKey = "foo";
       var arg_date = "foo";
       var arg_customerId = "foo";
@@ -956,18 +1015,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("admin/reports/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("usage/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("usage/users/"));
         pathOffset += 12;
         index = path.indexOf("/dates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/dates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/dates/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -983,32 +1047,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["parameters"].first, unittest.equals(arg_parameters));
-
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["parameters"].first, unittest.equals(arg_parameters));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUsageReports());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userKey, arg_date, customerId: arg_customerId, filters: arg_filters, maxResults: arg_maxResults, pageToken: arg_pageToken, parameters: arg_parameters).then(unittest.expectAsync1(((api.UsageReports response) {
+      res
+          .get(arg_userKey, arg_date,
+              customerId: arg_customerId,
+              filters: arg_filters,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              parameters: arg_parameters)
+          .then(unittest.expectAsync1(((api.UsageReports response) {
         checkUsageReports(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 005db1e..c5be592 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -1,12 +1,10 @@
 library googleapis.analytics.v3.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/analytics/v3.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -72,14 +71,14 @@
   buildCounterAccountChildLink--;
 }
 
-buildUnnamed999() {
+buildUnnamed1002() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed999(core.List<core.String> o) {
+checkUnnamed1002(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -90,7 +89,7 @@
   var o = new api.AccountPermissions();
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    o.effective = buildUnnamed999();
+    o.effective = buildUnnamed1002();
   }
   buildCounterAccountPermissions--;
   return o;
@@ -99,7 +98,7 @@
 checkAccountPermissions(api.AccountPermissions o) {
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    checkUnnamed999(o.effective);
+    checkUnnamed1002(o.effective);
   }
   buildCounterAccountPermissions--;
 }
@@ -127,14 +126,16 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     checkAccountChildLink(o.childLink);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkAccountPermissions(o.permissions);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.starred, unittest.isTrue);
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterAccount--;
 }
@@ -164,14 +165,14 @@
   buildCounterAccountRef--;
 }
 
-buildUnnamed1000() {
+buildUnnamed1003() {
   var o = new core.List<api.AccountSummary>();
   o.add(buildAccountSummary());
   o.add(buildAccountSummary());
   return o;
 }
 
-checkUnnamed1000(core.List<api.AccountSummary> o) {
+checkUnnamed1003(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountSummary(o[0]);
   checkAccountSummary(o[1]);
@@ -182,7 +183,7 @@
   var o = new api.AccountSummaries();
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    o.items = buildUnnamed1000();
+    o.items = buildUnnamed1003();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -198,7 +199,7 @@
 checkAccountSummaries(api.AccountSummaries o) {
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    checkUnnamed1000(o.items);
+    checkUnnamed1003(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -210,14 +211,14 @@
   buildCounterAccountSummaries--;
 }
 
-buildUnnamed1001() {
+buildUnnamed1004() {
   var o = new core.List<api.WebPropertySummary>();
   o.add(buildWebPropertySummary());
   o.add(buildWebPropertySummary());
   return o;
 }
 
-checkUnnamed1001(core.List<api.WebPropertySummary> o) {
+checkUnnamed1004(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPropertySummary(o[0]);
   checkWebPropertySummary(o[1]);
@@ -232,7 +233,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.starred = true;
-    o.webProperties = buildUnnamed1001();
+    o.webProperties = buildUnnamed1004();
   }
   buildCounterAccountSummary--;
   return o;
@@ -245,7 +246,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.starred, unittest.isTrue);
-    checkUnnamed1001(o.webProperties);
+    checkUnnamed1004(o.webProperties);
   }
   buildCounterAccountSummary--;
 }
@@ -279,14 +280,14 @@
   buildCounterAccountTicket--;
 }
 
-buildUnnamed1002() {
+buildUnnamed1005() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1002(core.List<api.Account> o) {
+checkUnnamed1005(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -297,7 +298,7 @@
   var o = new api.Accounts();
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    o.items = buildUnnamed1002();
+    o.items = buildUnnamed1005();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -313,7 +314,7 @@
 checkAccounts(api.Accounts o) {
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    checkUnnamed1002(o.items);
+    checkUnnamed1005(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -348,14 +349,14 @@
   buildCounterAdWordsAccount--;
 }
 
-buildUnnamed1003() {
+buildUnnamed1006() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1003(core.List<core.String> o) {
+checkUnnamed1006(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -366,28 +367,29 @@
   var o = new api.AnalyticsDataimportDeleteUploadDataRequest();
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    o.customDataImportUids = buildUnnamed1003();
+    o.customDataImportUids = buildUnnamed1006();
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
   return o;
 }
 
-checkAnalyticsDataimportDeleteUploadDataRequest(api.AnalyticsDataimportDeleteUploadDataRequest o) {
+checkAnalyticsDataimportDeleteUploadDataRequest(
+    api.AnalyticsDataimportDeleteUploadDataRequest o) {
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    checkUnnamed1003(o.customDataImportUids);
+    checkUnnamed1006(o.customDataImportUids);
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
 }
 
-buildUnnamed1004() {
+buildUnnamed1007() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1004(core.Map<core.String, core.String> o) {
+checkUnnamed1007(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -398,7 +400,7 @@
   var o = new api.Column();
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    o.attributes = buildUnnamed1004();
+    o.attributes = buildUnnamed1007();
     o.id = "foo";
     o.kind = "foo";
   }
@@ -409,34 +411,34 @@
 checkColumn(api.Column o) {
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    checkUnnamed1004(o.attributes);
+    checkUnnamed1007(o.attributes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterColumn--;
 }
 
-buildUnnamed1005() {
+buildUnnamed1008() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1005(core.List<core.String> o) {
+checkUnnamed1008(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1006() {
+buildUnnamed1009() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1006(core.List<api.Column> o) {
+checkUnnamed1009(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -447,9 +449,9 @@
   var o = new api.Columns();
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    o.attributeNames = buildUnnamed1005();
+    o.attributeNames = buildUnnamed1008();
     o.etag = "foo";
-    o.items = buildUnnamed1006();
+    o.items = buildUnnamed1009();
     o.kind = "foo";
     o.totalResults = 42;
   }
@@ -460,9 +462,9 @@
 checkColumns(api.Columns o) {
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    checkUnnamed1005(o.attributeNames);
+    checkUnnamed1008(o.attributeNames);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1006(o.items);
+    checkUnnamed1009(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
   }
@@ -511,27 +513,27 @@
   buildCounterCustomDataSourceParentLink--;
 }
 
-buildUnnamed1007() {
+buildUnnamed1010() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1007(core.List<core.String> o) {
+checkUnnamed1010(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1008() {
+buildUnnamed1011() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1008(core.List<core.String> o) {
+checkUnnamed1011(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -551,8 +553,8 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentLink = buildCustomDataSourceParentLink();
-    o.profilesLinked = buildUnnamed1007();
-    o.schema = buildUnnamed1008();
+    o.profilesLinked = buildUnnamed1010();
+    o.schema = buildUnnamed1011();
     o.selfLink = "foo";
     o.type = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -568,32 +570,34 @@
   if (buildCounterCustomDataSource < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkCustomDataSourceChildLink(o.childLink);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.importBehavior, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkCustomDataSourceParentLink(o.parentLink);
-    checkUnnamed1007(o.profilesLinked);
-    checkUnnamed1008(o.schema);
+    checkUnnamed1010(o.profilesLinked);
+    checkUnnamed1011(o.schema);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.uploadType, unittest.equals('foo'));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
   buildCounterCustomDataSource--;
 }
 
-buildUnnamed1009() {
+buildUnnamed1012() {
   var o = new core.List<api.CustomDataSource>();
   o.add(buildCustomDataSource());
   o.add(buildCustomDataSource());
   return o;
 }
 
-checkUnnamed1009(core.List<api.CustomDataSource> o) {
+checkUnnamed1012(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDataSource(o[0]);
   checkCustomDataSource(o[1]);
@@ -604,7 +608,7 @@
   var o = new api.CustomDataSources();
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    o.items = buildUnnamed1009();
+    o.items = buildUnnamed1012();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -620,7 +624,7 @@
 checkCustomDataSources(api.CustomDataSources o) {
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    checkUnnamed1009(o.items);
+    checkUnnamed1012(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -680,7 +684,8 @@
   if (buildCounterCustomDimension < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -688,20 +693,21 @@
     checkCustomDimensionParentLink(o.parentLink);
     unittest.expect(o.scope, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
   buildCounterCustomDimension--;
 }
 
-buildUnnamed1010() {
+buildUnnamed1013() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed1010(core.List<api.CustomDimension> o) {
+checkUnnamed1013(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
@@ -712,7 +718,7 @@
   var o = new api.CustomDimensions();
   buildCounterCustomDimensions++;
   if (buildCounterCustomDimensions < 3) {
-    o.items = buildUnnamed1010();
+    o.items = buildUnnamed1013();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -728,7 +734,7 @@
 checkCustomDimensions(api.CustomDimensions o) {
   buildCounterCustomDimensions++;
   if (buildCounterCustomDimensions < 3) {
-    checkUnnamed1010(o.items);
+    checkUnnamed1013(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -791,7 +797,8 @@
   if (buildCounterCustomMetric < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -802,20 +809,21 @@
     unittest.expect(o.scope, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
   buildCounterCustomMetric--;
 }
 
-buildUnnamed1011() {
+buildUnnamed1014() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed1011(core.List<api.CustomMetric> o) {
+checkUnnamed1014(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -826,7 +834,7 @@
   var o = new api.CustomMetrics();
   buildCounterCustomMetrics++;
   if (buildCounterCustomMetrics < 3) {
-    o.items = buildUnnamed1011();
+    o.items = buildUnnamed1014();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -842,7 +850,7 @@
 checkCustomMetrics(api.CustomMetrics o) {
   buildCounterCustomMetrics++;
   if (buildCounterCustomMetrics < 3) {
-    checkUnnamed1011(o.items);
+    checkUnnamed1014(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -854,14 +862,14 @@
   buildCounterCustomMetrics--;
 }
 
-buildUnnamed1012() {
+buildUnnamed1015() {
   var o = new core.List<api.AdWordsAccount>();
   o.add(buildAdWordsAccount());
   o.add(buildAdWordsAccount());
   return o;
 }
 
-checkUnnamed1012(core.List<api.AdWordsAccount> o) {
+checkUnnamed1015(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsAccount(o[0]);
   checkAdWordsAccount(o[1]);
@@ -886,14 +894,14 @@
   buildCounterEntityAdWordsLinkEntity--;
 }
 
-buildUnnamed1013() {
+buildUnnamed1016() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1013(core.List<core.String> o) {
+checkUnnamed1016(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -904,12 +912,12 @@
   var o = new api.EntityAdWordsLink();
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    o.adWordsAccounts = buildUnnamed1012();
+    o.adWordsAccounts = buildUnnamed1015();
     o.entity = buildEntityAdWordsLinkEntity();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.profileIds = buildUnnamed1013();
+    o.profileIds = buildUnnamed1016();
     o.selfLink = "foo";
   }
   buildCounterEntityAdWordsLink--;
@@ -919,25 +927,25 @@
 checkEntityAdWordsLink(api.EntityAdWordsLink o) {
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    checkUnnamed1012(o.adWordsAccounts);
+    checkUnnamed1015(o.adWordsAccounts);
     checkEntityAdWordsLinkEntity(o.entity);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1013(o.profileIds);
+    checkUnnamed1016(o.profileIds);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterEntityAdWordsLink--;
 }
 
-buildUnnamed1014() {
+buildUnnamed1017() {
   var o = new core.List<api.EntityAdWordsLink>();
   o.add(buildEntityAdWordsLink());
   o.add(buildEntityAdWordsLink());
   return o;
 }
 
-checkUnnamed1014(core.List<api.EntityAdWordsLink> o) {
+checkUnnamed1017(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAdWordsLink(o[0]);
   checkEntityAdWordsLink(o[1]);
@@ -948,7 +956,7 @@
   var o = new api.EntityAdWordsLinks();
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    o.items = buildUnnamed1014();
+    o.items = buildUnnamed1017();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -963,7 +971,7 @@
 checkEntityAdWordsLinks(api.EntityAdWordsLinks o) {
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    checkUnnamed1014(o.items);
+    checkUnnamed1017(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -997,27 +1005,27 @@
   buildCounterEntityUserLinkEntity--;
 }
 
-buildUnnamed1015() {
+buildUnnamed1018() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1015(core.List<core.String> o) {
+checkUnnamed1018(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1016() {
+buildUnnamed1019() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1016(core.List<core.String> o) {
+checkUnnamed1019(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1028,8 +1036,8 @@
   var o = new api.EntityUserLinkPermissions();
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    o.effective = buildUnnamed1015();
-    o.local = buildUnnamed1016();
+    o.effective = buildUnnamed1018();
+    o.local = buildUnnamed1019();
   }
   buildCounterEntityUserLinkPermissions--;
   return o;
@@ -1038,8 +1046,8 @@
 checkEntityUserLinkPermissions(api.EntityUserLinkPermissions o) {
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    checkUnnamed1015(o.effective);
-    checkUnnamed1016(o.local);
+    checkUnnamed1018(o.effective);
+    checkUnnamed1019(o.local);
   }
   buildCounterEntityUserLinkPermissions--;
 }
@@ -1073,14 +1081,14 @@
   buildCounterEntityUserLink--;
 }
 
-buildUnnamed1017() {
+buildUnnamed1020() {
   var o = new core.List<api.EntityUserLink>();
   o.add(buildEntityUserLink());
   o.add(buildEntityUserLink());
   return o;
 }
 
-checkUnnamed1017(core.List<api.EntityUserLink> o) {
+checkUnnamed1020(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityUserLink(o[0]);
   checkEntityUserLink(o[1]);
@@ -1091,7 +1099,7 @@
   var o = new api.EntityUserLinks();
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    o.items = buildUnnamed1017();
+    o.items = buildUnnamed1020();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1106,7 +1114,7 @@
 checkEntityUserLinks(api.EntityUserLinks o) {
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    checkUnnamed1017(o.items);
+    checkUnnamed1020(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1165,14 +1173,14 @@
   buildCounterExperimentVariations--;
 }
 
-buildUnnamed1018() {
+buildUnnamed1021() {
   var o = new core.List<api.ExperimentVariations>();
   o.add(buildExperimentVariations());
   o.add(buildExperimentVariations());
   return o;
 }
 
-checkUnnamed1018(core.List<api.ExperimentVariations> o) {
+checkUnnamed1021(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperimentVariations(o[0]);
   checkExperimentVariations(o[1]);
@@ -1207,7 +1215,7 @@
     o.status = "foo";
     o.trafficCoverage = 42.0;
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
-    o.variations = buildUnnamed1018();
+    o.variations = buildUnnamed1021();
     o.webPropertyId = "foo";
     o.winnerConfidenceLevel = 42.0;
     o.winnerFound = true;
@@ -1220,10 +1228,12 @@
   buildCounterExperiment++;
   if (buildCounterExperiment < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.editableInGaUi, unittest.isTrue);
-    unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.equalWeighting, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
@@ -1239,11 +1249,13 @@
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.servingFramework, unittest.equals('foo'));
     unittest.expect(o.snippet, unittest.equals('foo'));
-    unittest.expect(o.startTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.startTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trafficCoverage, unittest.equals(42.0));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1018(o.variations);
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed1021(o.variations);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.winnerConfidenceLevel, unittest.equals(42.0));
     unittest.expect(o.winnerFound, unittest.isTrue);
@@ -1251,14 +1263,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed1019() {
+buildUnnamed1022() {
   var o = new core.List<api.Experiment>();
   o.add(buildExperiment());
   o.add(buildExperiment());
   return o;
 }
 
-checkUnnamed1019(core.List<api.Experiment> o) {
+checkUnnamed1022(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperiment(o[0]);
   checkExperiment(o[1]);
@@ -1269,7 +1281,7 @@
   var o = new api.Experiments();
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    o.items = buildUnnamed1019();
+    o.items = buildUnnamed1022();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1285,7 +1297,7 @@
 checkExperiments(api.Experiments o) {
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    checkUnnamed1019(o.items);
+    checkUnnamed1022(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1460,7 +1472,8 @@
   if (buildCounterFilter < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkFilterAdvancedDetails(o.advancedDetails);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkFilterExpression(o.excludeDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     checkFilterExpression(o.includeDetails);
@@ -1471,7 +1484,8 @@
     checkFilterSearchAndReplaceDetails(o.searchAndReplaceDetails);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkFilterUppercaseDetails(o.uppercaseDetails);
   }
   buildCounterFilter--;
@@ -1533,14 +1547,14 @@
   buildCounterFilterRef--;
 }
 
-buildUnnamed1020() {
+buildUnnamed1023() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed1020(core.List<api.Filter> o) {
+checkUnnamed1023(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -1551,7 +1565,7 @@
   var o = new api.Filters();
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    o.items = buildUnnamed1020();
+    o.items = buildUnnamed1023();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1567,7 +1581,7 @@
 checkFilters(api.Filters o) {
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    checkUnnamed1020(o.items);
+    checkUnnamed1023(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1602,14 +1616,14 @@
   buildCounterGaDataColumnHeaders--;
 }
 
-buildUnnamed1021() {
+buildUnnamed1024() {
   var o = new core.List<api.GaDataColumnHeaders>();
   o.add(buildGaDataColumnHeaders());
   o.add(buildGaDataColumnHeaders());
   return o;
 }
 
-checkUnnamed1021(core.List<api.GaDataColumnHeaders> o) {
+checkUnnamed1024(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataColumnHeaders(o[0]);
   checkGaDataColumnHeaders(o[1]);
@@ -1638,14 +1652,14 @@
   buildCounterGaDataDataTableCols--;
 }
 
-buildUnnamed1022() {
+buildUnnamed1025() {
   var o = new core.List<api.GaDataDataTableCols>();
   o.add(buildGaDataDataTableCols());
   o.add(buildGaDataDataTableCols());
   return o;
 }
 
-checkUnnamed1022(core.List<api.GaDataDataTableCols> o) {
+checkUnnamed1025(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableCols(o[0]);
   checkGaDataDataTableCols(o[1]);
@@ -1670,14 +1684,14 @@
   buildCounterGaDataDataTableRowsC--;
 }
 
-buildUnnamed1023() {
+buildUnnamed1026() {
   var o = new core.List<api.GaDataDataTableRowsC>();
   o.add(buildGaDataDataTableRowsC());
   o.add(buildGaDataDataTableRowsC());
   return o;
 }
 
-checkUnnamed1023(core.List<api.GaDataDataTableRowsC> o) {
+checkUnnamed1026(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRowsC(o[0]);
   checkGaDataDataTableRowsC(o[1]);
@@ -1688,7 +1702,7 @@
   var o = new api.GaDataDataTableRows();
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    o.c = buildUnnamed1023();
+    o.c = buildUnnamed1026();
   }
   buildCounterGaDataDataTableRows--;
   return o;
@@ -1697,19 +1711,19 @@
 checkGaDataDataTableRows(api.GaDataDataTableRows o) {
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    checkUnnamed1023(o.c);
+    checkUnnamed1026(o.c);
   }
   buildCounterGaDataDataTableRows--;
 }
 
-buildUnnamed1024() {
+buildUnnamed1027() {
   var o = new core.List<api.GaDataDataTableRows>();
   o.add(buildGaDataDataTableRows());
   o.add(buildGaDataDataTableRows());
   return o;
 }
 
-checkUnnamed1024(core.List<api.GaDataDataTableRows> o) {
+checkUnnamed1027(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRows(o[0]);
   checkGaDataDataTableRows(o[1]);
@@ -1720,8 +1734,8 @@
   var o = new api.GaDataDataTable();
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    o.cols = buildUnnamed1022();
-    o.rows = buildUnnamed1024();
+    o.cols = buildUnnamed1025();
+    o.rows = buildUnnamed1027();
   }
   buildCounterGaDataDataTable--;
   return o;
@@ -1730,8 +1744,8 @@
 checkGaDataDataTable(api.GaDataDataTable o) {
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    checkUnnamed1022(o.cols);
-    checkUnnamed1024(o.rows);
+    checkUnnamed1025(o.cols);
+    checkUnnamed1027(o.rows);
   }
   buildCounterGaDataDataTable--;
 }
@@ -1765,27 +1779,27 @@
   buildCounterGaDataProfileInfo--;
 }
 
-buildUnnamed1025() {
+buildUnnamed1028() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1025(core.List<core.String> o) {
+checkUnnamed1028(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1026() {
+buildUnnamed1029() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1026(core.List<core.String> o) {
+checkUnnamed1029(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1801,10 +1815,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed1025();
+    o.metrics = buildUnnamed1028();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed1026();
+    o.sort = buildUnnamed1029();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -1820,50 +1834,50 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed1025(o.metrics);
+    checkUnnamed1028(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed1026(o.sort);
+    checkUnnamed1029(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
   buildCounterGaDataQuery--;
 }
 
-buildUnnamed1027() {
+buildUnnamed1030() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1027(core.List<core.String> o) {
+checkUnnamed1030(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1028() {
+buildUnnamed1031() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1027());
-  o.add(buildUnnamed1027());
+  o.add(buildUnnamed1030());
+  o.add(buildUnnamed1030());
   return o;
 }
 
-checkUnnamed1028(core.List<core.List<core.String>> o) {
+checkUnnamed1031(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1027(o[0]);
-  checkUnnamed1027(o[1]);
+  checkUnnamed1030(o[0]);
+  checkUnnamed1030(o[1]);
 }
 
-buildUnnamed1029() {
+buildUnnamed1032() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1029(core.Map<core.String, core.String> o) {
+checkUnnamed1032(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1874,7 +1888,7 @@
   var o = new api.GaData();
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    o.columnHeaders = buildUnnamed1021();
+    o.columnHeaders = buildUnnamed1024();
     o.containsSampledData = true;
     o.dataLastRefreshed = "foo";
     o.dataTable = buildGaDataDataTable();
@@ -1885,12 +1899,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildGaDataProfileInfo();
     o.query = buildGaDataQuery();
-    o.rows = buildUnnamed1028();
+    o.rows = buildUnnamed1031();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed1029();
+    o.totalsForAllResults = buildUnnamed1032();
   }
   buildCounterGaData--;
   return o;
@@ -1899,7 +1913,7 @@
 checkGaData(api.GaData o) {
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    checkUnnamed1021(o.columnHeaders);
+    checkUnnamed1024(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.dataLastRefreshed, unittest.equals('foo'));
     checkGaDataDataTable(o.dataTable);
@@ -1910,12 +1924,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkGaDataProfileInfo(o.profileInfo);
     checkGaDataQuery(o.query);
-    checkUnnamed1028(o.rows);
+    checkUnnamed1031(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed1029(o.totalsForAllResults);
+    checkUnnamed1032(o.totalsForAllResults);
   }
   buildCounterGaData--;
 }
@@ -1947,14 +1961,14 @@
   buildCounterGoalEventDetailsEventConditions--;
 }
 
-buildUnnamed1030() {
+buildUnnamed1033() {
   var o = new core.List<api.GoalEventDetailsEventConditions>();
   o.add(buildGoalEventDetailsEventConditions());
   o.add(buildGoalEventDetailsEventConditions());
   return o;
 }
 
-checkUnnamed1030(core.List<api.GoalEventDetailsEventConditions> o) {
+checkUnnamed1033(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalEventDetailsEventConditions(o[0]);
   checkGoalEventDetailsEventConditions(o[1]);
@@ -1965,7 +1979,7 @@
   var o = new api.GoalEventDetails();
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    o.eventConditions = buildUnnamed1030();
+    o.eventConditions = buildUnnamed1033();
     o.useEventValue = true;
   }
   buildCounterGoalEventDetails--;
@@ -1975,7 +1989,7 @@
 checkGoalEventDetails(api.GoalEventDetails o) {
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    checkUnnamed1030(o.eventConditions);
+    checkUnnamed1033(o.eventConditions);
     unittest.expect(o.useEventValue, unittest.isTrue);
   }
   buildCounterGoalEventDetails--;
@@ -2025,14 +2039,14 @@
   buildCounterGoalUrlDestinationDetailsSteps--;
 }
 
-buildUnnamed1031() {
+buildUnnamed1034() {
   var o = new core.List<api.GoalUrlDestinationDetailsSteps>();
   o.add(buildGoalUrlDestinationDetailsSteps());
   o.add(buildGoalUrlDestinationDetailsSteps());
   return o;
 }
 
-checkUnnamed1031(core.List<api.GoalUrlDestinationDetailsSteps> o) {
+checkUnnamed1034(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalUrlDestinationDetailsSteps(o[0]);
   checkGoalUrlDestinationDetailsSteps(o[1]);
@@ -2046,7 +2060,7 @@
     o.caseSensitive = true;
     o.firstStepRequired = true;
     o.matchType = "foo";
-    o.steps = buildUnnamed1031();
+    o.steps = buildUnnamed1034();
     o.url = "foo";
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2059,7 +2073,7 @@
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.firstStepRequired, unittest.isTrue);
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed1031(o.steps);
+    checkUnnamed1034(o.steps);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2140,7 +2154,8 @@
   if (buildCounterGoal < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkGoalEventDetails(o.eventDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
@@ -2150,7 +2165,8 @@
     unittest.expect(o.profileId, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkGoalUrlDestinationDetails(o.urlDestinationDetails);
     unittest.expect(o.value, unittest.equals(42.0));
     checkGoalVisitNumPagesDetails(o.visitNumPagesDetails);
@@ -2160,14 +2176,14 @@
   buildCounterGoal--;
 }
 
-buildUnnamed1032() {
+buildUnnamed1035() {
   var o = new core.List<api.Goal>();
   o.add(buildGoal());
   o.add(buildGoal());
   return o;
 }
 
-checkUnnamed1032(core.List<api.Goal> o) {
+checkUnnamed1035(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoal(o[0]);
   checkGoal(o[1]);
@@ -2178,7 +2194,7 @@
   var o = new api.Goals();
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    o.items = buildUnnamed1032();
+    o.items = buildUnnamed1035();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2194,7 +2210,7 @@
 checkGoals(api.Goals o) {
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    checkUnnamed1032(o.items);
+    checkUnnamed1035(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2293,14 +2309,14 @@
   buildCounterMcfDataColumnHeaders--;
 }
 
-buildUnnamed1033() {
+buildUnnamed1036() {
   var o = new core.List<api.McfDataColumnHeaders>();
   o.add(buildMcfDataColumnHeaders());
   o.add(buildMcfDataColumnHeaders());
   return o;
 }
 
-checkUnnamed1033(core.List<api.McfDataColumnHeaders> o) {
+checkUnnamed1036(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataColumnHeaders(o[0]);
   checkMcfDataColumnHeaders(o[1]);
@@ -2335,27 +2351,27 @@
   buildCounterMcfDataProfileInfo--;
 }
 
-buildUnnamed1034() {
+buildUnnamed1037() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1034(core.List<core.String> o) {
+checkUnnamed1037(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1035() {
+buildUnnamed1038() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1035(core.List<core.String> o) {
+checkUnnamed1038(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2371,10 +2387,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed1034();
+    o.metrics = buildUnnamed1037();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed1035();
+    o.sort = buildUnnamed1038();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -2390,10 +2406,10 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed1034(o.metrics);
+    checkUnnamed1037(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed1035(o.sort);
+    checkUnnamed1038(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
@@ -2421,14 +2437,14 @@
   buildCounterMcfDataRowsConversionPathValue--;
 }
 
-buildUnnamed1036() {
+buildUnnamed1039() {
   var o = new core.List<api.McfDataRowsConversionPathValue>();
   o.add(buildMcfDataRowsConversionPathValue());
   o.add(buildMcfDataRowsConversionPathValue());
   return o;
 }
 
-checkUnnamed1036(core.List<api.McfDataRowsConversionPathValue> o) {
+checkUnnamed1039(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRowsConversionPathValue(o[0]);
   checkMcfDataRowsConversionPathValue(o[1]);
@@ -2439,7 +2455,7 @@
   var o = new api.McfDataRows();
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    o.conversionPathValue = buildUnnamed1036();
+    o.conversionPathValue = buildUnnamed1039();
     o.primitiveValue = "foo";
   }
   buildCounterMcfDataRows--;
@@ -2449,46 +2465,46 @@
 checkMcfDataRows(api.McfDataRows o) {
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    checkUnnamed1036(o.conversionPathValue);
+    checkUnnamed1039(o.conversionPathValue);
     unittest.expect(o.primitiveValue, unittest.equals('foo'));
   }
   buildCounterMcfDataRows--;
 }
 
-buildUnnamed1037() {
+buildUnnamed1040() {
   var o = new core.List<api.McfDataRows>();
   o.add(buildMcfDataRows());
   o.add(buildMcfDataRows());
   return o;
 }
 
-checkUnnamed1037(core.List<api.McfDataRows> o) {
+checkUnnamed1040(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRows(o[0]);
   checkMcfDataRows(o[1]);
 }
 
-buildUnnamed1038() {
+buildUnnamed1041() {
   var o = new core.List<core.List<api.McfDataRows>>();
-  o.add(buildUnnamed1037());
-  o.add(buildUnnamed1037());
+  o.add(buildUnnamed1040());
+  o.add(buildUnnamed1040());
   return o;
 }
 
-checkUnnamed1038(core.List<core.List<api.McfDataRows>> o) {
+checkUnnamed1041(core.List<core.List<api.McfDataRows>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1037(o[0]);
-  checkUnnamed1037(o[1]);
+  checkUnnamed1040(o[0]);
+  checkUnnamed1040(o[1]);
 }
 
-buildUnnamed1039() {
+buildUnnamed1042() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1039(core.Map<core.String, core.String> o) {
+checkUnnamed1042(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2499,7 +2515,7 @@
   var o = new api.McfData();
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    o.columnHeaders = buildUnnamed1033();
+    o.columnHeaders = buildUnnamed1036();
     o.containsSampledData = true;
     o.id = "foo";
     o.itemsPerPage = 42;
@@ -2508,12 +2524,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildMcfDataProfileInfo();
     o.query = buildMcfDataQuery();
-    o.rows = buildUnnamed1038();
+    o.rows = buildUnnamed1041();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed1039();
+    o.totalsForAllResults = buildUnnamed1042();
   }
   buildCounterMcfData--;
   return o;
@@ -2522,7 +2538,7 @@
 checkMcfData(api.McfData o) {
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    checkUnnamed1033(o.columnHeaders);
+    checkUnnamed1036(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
@@ -2531,12 +2547,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkMcfDataProfileInfo(o.profileInfo);
     checkMcfDataQuery(o.query);
-    checkUnnamed1038(o.rows);
+    checkUnnamed1041(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed1039(o.totalsForAllResults);
+    checkUnnamed1042(o.totalsForAllResults);
   }
   buildCounterMcfData--;
 }
@@ -2583,14 +2599,14 @@
   buildCounterProfileParentLink--;
 }
 
-buildUnnamed1040() {
+buildUnnamed1043() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1040(core.List<core.String> o) {
+checkUnnamed1043(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2601,7 +2617,7 @@
   var o = new api.ProfilePermissions();
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    o.effective = buildUnnamed1040();
+    o.effective = buildUnnamed1043();
   }
   buildCounterProfilePermissions--;
   return o;
@@ -2610,7 +2626,7 @@
 checkProfilePermissions(api.ProfilePermissions o) {
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    checkUnnamed1040(o.effective);
+    checkUnnamed1043(o.effective);
   }
   buildCounterProfilePermissions--;
 }
@@ -2657,7 +2673,8 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.botFilteringEnabled, unittest.isTrue);
     checkProfileChildLink(o.childLink);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.currency, unittest.equals('foo'));
     unittest.expect(o.defaultPage, unittest.equals('foo'));
     unittest.expect(o.eCommerceTracking, unittest.isTrue);
@@ -2677,7 +2694,8 @@
     unittest.expect(o.stripSiteSearchQueryParameters, unittest.isTrue);
     unittest.expect(o.timezone, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
@@ -2713,14 +2731,14 @@
   buildCounterProfileFilterLink--;
 }
 
-buildUnnamed1041() {
+buildUnnamed1044() {
   var o = new core.List<api.ProfileFilterLink>();
   o.add(buildProfileFilterLink());
   o.add(buildProfileFilterLink());
   return o;
 }
 
-checkUnnamed1041(core.List<api.ProfileFilterLink> o) {
+checkUnnamed1044(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileFilterLink(o[0]);
   checkProfileFilterLink(o[1]);
@@ -2731,7 +2749,7 @@
   var o = new api.ProfileFilterLinks();
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    o.items = buildUnnamed1041();
+    o.items = buildUnnamed1044();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2747,7 +2765,7 @@
 checkProfileFilterLinks(api.ProfileFilterLinks o) {
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    checkUnnamed1041(o.items);
+    checkUnnamed1044(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2817,14 +2835,14 @@
   buildCounterProfileSummary--;
 }
 
-buildUnnamed1042() {
+buildUnnamed1045() {
   var o = new core.List<api.Profile>();
   o.add(buildProfile());
   o.add(buildProfile());
   return o;
 }
 
-checkUnnamed1042(core.List<api.Profile> o) {
+checkUnnamed1045(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfile(o[0]);
   checkProfile(o[1]);
@@ -2835,7 +2853,7 @@
   var o = new api.Profiles();
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    o.items = buildUnnamed1042();
+    o.items = buildUnnamed1045();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2851,7 +2869,7 @@
 checkProfiles(api.Profiles o) {
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    checkUnnamed1042(o.items);
+    checkUnnamed1045(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2886,14 +2904,14 @@
   buildCounterRealtimeDataColumnHeaders--;
 }
 
-buildUnnamed1043() {
+buildUnnamed1046() {
   var o = new core.List<api.RealtimeDataColumnHeaders>();
   o.add(buildRealtimeDataColumnHeaders());
   o.add(buildRealtimeDataColumnHeaders());
   return o;
 }
 
-checkUnnamed1043(core.List<api.RealtimeDataColumnHeaders> o) {
+checkUnnamed1046(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRealtimeDataColumnHeaders(o[0]);
   checkRealtimeDataColumnHeaders(o[1]);
@@ -2928,27 +2946,27 @@
   buildCounterRealtimeDataProfileInfo--;
 }
 
-buildUnnamed1044() {
+buildUnnamed1047() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1044(core.List<core.String> o) {
+checkUnnamed1047(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1045() {
+buildUnnamed1048() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1045(core.List<core.String> o) {
+checkUnnamed1048(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2963,8 +2981,8 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed1044();
-    o.sort = buildUnnamed1045();
+    o.metrics = buildUnnamed1047();
+    o.sort = buildUnnamed1048();
   }
   buildCounterRealtimeDataQuery--;
   return o;
@@ -2977,46 +2995,46 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed1044(o.metrics);
-    checkUnnamed1045(o.sort);
+    checkUnnamed1047(o.metrics);
+    checkUnnamed1048(o.sort);
   }
   buildCounterRealtimeDataQuery--;
 }
 
-buildUnnamed1046() {
+buildUnnamed1049() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1046(core.List<core.String> o) {
+checkUnnamed1049(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1047() {
+buildUnnamed1050() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1046());
-  o.add(buildUnnamed1046());
+  o.add(buildUnnamed1049());
+  o.add(buildUnnamed1049());
   return o;
 }
 
-checkUnnamed1047(core.List<core.List<core.String>> o) {
+checkUnnamed1050(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1046(o[0]);
-  checkUnnamed1046(o[1]);
+  checkUnnamed1049(o[0]);
+  checkUnnamed1049(o[1]);
 }
 
-buildUnnamed1048() {
+buildUnnamed1051() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1048(core.Map<core.String, core.String> o) {
+checkUnnamed1051(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -3027,15 +3045,15 @@
   var o = new api.RealtimeData();
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    o.columnHeaders = buildUnnamed1043();
+    o.columnHeaders = buildUnnamed1046();
     o.id = "foo";
     o.kind = "foo";
     o.profileInfo = buildRealtimeDataProfileInfo();
     o.query = buildRealtimeDataQuery();
-    o.rows = buildUnnamed1047();
+    o.rows = buildUnnamed1050();
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed1048();
+    o.totalsForAllResults = buildUnnamed1051();
   }
   buildCounterRealtimeData--;
   return o;
@@ -3044,15 +3062,15 @@
 checkRealtimeData(api.RealtimeData o) {
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    checkUnnamed1043(o.columnHeaders);
+    checkUnnamed1046(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRealtimeDataProfileInfo(o.profileInfo);
     checkRealtimeDataQuery(o.query);
-    checkUnnamed1047(o.rows);
+    checkUnnamed1050(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed1048(o.totalsForAllResults);
+    checkUnnamed1051(o.totalsForAllResults);
   }
   buildCounterRealtimeData--;
 }
@@ -3068,7 +3086,8 @@
   return o;
 }
 
-checkRemarketingAudienceAudienceDefinition(api.RemarketingAudienceAudienceDefinition o) {
+checkRemarketingAudienceAudienceDefinition(
+    api.RemarketingAudienceAudienceDefinition o) {
   buildCounterRemarketingAudienceAudienceDefinition++;
   if (buildCounterRemarketingAudienceAudienceDefinition < 3) {
     checkIncludeConditions(o.includeConditions);
@@ -3076,37 +3095,41 @@
   buildCounterRemarketingAudienceAudienceDefinition--;
 }
 
-buildUnnamed1049() {
+buildUnnamed1052() {
   var o = new core.List<api.LinkedForeignAccount>();
   o.add(buildLinkedForeignAccount());
   o.add(buildLinkedForeignAccount());
   return o;
 }
 
-checkUnnamed1049(core.List<api.LinkedForeignAccount> o) {
+checkUnnamed1052(core.List<api.LinkedForeignAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLinkedForeignAccount(o[0]);
   checkLinkedForeignAccount(o[1]);
 }
 
-buildUnnamed1050() {
+buildUnnamed1053() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1050(core.List<core.String> o) {
+checkUnnamed1053(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions = 0;
+core.int
+    buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions =
+    0;
 buildRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions() {
-  var o = new api.RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
+  var o = new api
+      .RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
   buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions++;
-  if (buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions < 3) {
+  if (buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions <
+      3) {
     o.exclusionDuration = "foo";
     o.segment = "foo";
   }
@@ -3114,9 +3137,11 @@
   return o;
 }
 
-checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(api.RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions o) {
+checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(
+    api.RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions o) {
   buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions++;
-  if (buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions < 3) {
+  if (buildCounterRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions <
+      3) {
     unittest.expect(o.exclusionDuration, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
   }
@@ -3128,17 +3153,20 @@
   var o = new api.RemarketingAudienceStateBasedAudienceDefinition();
   buildCounterRemarketingAudienceStateBasedAudienceDefinition++;
   if (buildCounterRemarketingAudienceStateBasedAudienceDefinition < 3) {
-    o.excludeConditions = buildRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
+    o.excludeConditions =
+        buildRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
     o.includeConditions = buildIncludeConditions();
   }
   buildCounterRemarketingAudienceStateBasedAudienceDefinition--;
   return o;
 }
 
-checkRemarketingAudienceStateBasedAudienceDefinition(api.RemarketingAudienceStateBasedAudienceDefinition o) {
+checkRemarketingAudienceStateBasedAudienceDefinition(
+    api.RemarketingAudienceStateBasedAudienceDefinition o) {
   buildCounterRemarketingAudienceStateBasedAudienceDefinition++;
   if (buildCounterRemarketingAudienceStateBasedAudienceDefinition < 3) {
-    checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(o.excludeConditions);
+    checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(
+        o.excludeConditions);
     checkIncludeConditions(o.includeConditions);
   }
   buildCounterRemarketingAudienceStateBasedAudienceDefinition--;
@@ -3157,10 +3185,11 @@
     o.id = "foo";
     o.internalWebPropertyId = "foo";
     o.kind = "foo";
-    o.linkedAdAccounts = buildUnnamed1049();
-    o.linkedViews = buildUnnamed1050();
+    o.linkedAdAccounts = buildUnnamed1052();
+    o.linkedViews = buildUnnamed1053();
     o.name = "foo";
-    o.stateBasedAudienceDefinition = buildRemarketingAudienceStateBasedAudienceDefinition();
+    o.stateBasedAudienceDefinition =
+        buildRemarketingAudienceStateBasedAudienceDefinition();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.webPropertyId = "foo";
   }
@@ -3174,29 +3203,32 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkRemarketingAudienceAudienceDefinition(o.audienceDefinition);
     unittest.expect(o.audienceType, unittest.equals('foo'));
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1049(o.linkedAdAccounts);
-    checkUnnamed1050(o.linkedViews);
+    checkUnnamed1052(o.linkedAdAccounts);
+    checkUnnamed1053(o.linkedViews);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkRemarketingAudienceStateBasedAudienceDefinition(o.stateBasedAudienceDefinition);
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkRemarketingAudienceStateBasedAudienceDefinition(
+        o.stateBasedAudienceDefinition);
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
   buildCounterRemarketingAudience--;
 }
 
-buildUnnamed1051() {
+buildUnnamed1054() {
   var o = new core.List<api.RemarketingAudience>();
   o.add(buildRemarketingAudience());
   o.add(buildRemarketingAudience());
   return o;
 }
 
-checkUnnamed1051(core.List<api.RemarketingAudience> o) {
+checkUnnamed1054(core.List<api.RemarketingAudience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRemarketingAudience(o[0]);
   checkRemarketingAudience(o[1]);
@@ -3207,7 +3239,7 @@
   var o = new api.RemarketingAudiences();
   buildCounterRemarketingAudiences++;
   if (buildCounterRemarketingAudiences < 3) {
-    o.items = buildUnnamed1051();
+    o.items = buildUnnamed1054();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3223,7 +3255,7 @@
 checkRemarketingAudiences(api.RemarketingAudiences o) {
   buildCounterRemarketingAudiences++;
   if (buildCounterRemarketingAudiences < 3) {
-    checkUnnamed1051(o.items);
+    checkUnnamed1054(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3257,7 +3289,8 @@
 checkSegment(api.Segment o) {
   buildCounterSegment++;
   if (buildCounterSegment < 3) {
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.definition, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -3265,19 +3298,20 @@
     unittest.expect(o.segmentId, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterSegment--;
 }
 
-buildUnnamed1052() {
+buildUnnamed1055() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed1052(core.List<api.Segment> o) {
+checkUnnamed1055(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -3288,7 +3322,7 @@
   var o = new api.Segments();
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    o.items = buildUnnamed1052();
+    o.items = buildUnnamed1055();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3304,7 +3338,7 @@
 checkSegments(api.Segments o) {
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    checkUnnamed1052(o.items);
+    checkUnnamed1055(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3328,7 +3362,8 @@
   return o;
 }
 
-checkUnsampledReportCloudStorageDownloadDetails(api.UnsampledReportCloudStorageDownloadDetails o) {
+checkUnsampledReportCloudStorageDownloadDetails(
+    api.UnsampledReportCloudStorageDownloadDetails o) {
   buildCounterUnsampledReportCloudStorageDownloadDetails++;
   if (buildCounterUnsampledReportCloudStorageDownloadDetails < 3) {
     unittest.expect(o.bucketId, unittest.equals('foo'));
@@ -3348,7 +3383,8 @@
   return o;
 }
 
-checkUnsampledReportDriveDownloadDetails(api.UnsampledReportDriveDownloadDetails o) {
+checkUnsampledReportDriveDownloadDetails(
+    api.UnsampledReportDriveDownloadDetails o) {
   buildCounterUnsampledReportDriveDownloadDetails++;
   if (buildCounterUnsampledReportDriveDownloadDetails < 3) {
     unittest.expect(o.documentId, unittest.equals('foo'));
@@ -3362,7 +3398,8 @@
   buildCounterUnsampledReport++;
   if (buildCounterUnsampledReport < 3) {
     o.accountId = "foo";
-    o.cloudStorageDownloadDetails = buildUnsampledReportCloudStorageDownloadDetails();
+    o.cloudStorageDownloadDetails =
+        buildUnsampledReportCloudStorageDownloadDetails();
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
     o.dimensions = "foo";
     o.downloadType = "foo";
@@ -3389,8 +3426,10 @@
   buildCounterUnsampledReport++;
   if (buildCounterUnsampledReport < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnsampledReportCloudStorageDownloadDetails(o.cloudStorageDownloadDetails);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnsampledReportCloudStorageDownloadDetails(
+        o.cloudStorageDownloadDetails);
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.dimensions, unittest.equals('foo'));
     unittest.expect(o.downloadType, unittest.equals('foo'));
     checkUnsampledReportDriveDownloadDetails(o.driveDownloadDetails);
@@ -3405,20 +3444,21 @@
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
   buildCounterUnsampledReport--;
 }
 
-buildUnnamed1053() {
+buildUnnamed1056() {
   var o = new core.List<api.UnsampledReport>();
   o.add(buildUnsampledReport());
   o.add(buildUnsampledReport());
   return o;
 }
 
-checkUnnamed1053(core.List<api.UnsampledReport> o) {
+checkUnnamed1056(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnsampledReport(o[0]);
   checkUnsampledReport(o[1]);
@@ -3429,7 +3469,7 @@
   var o = new api.UnsampledReports();
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    o.items = buildUnnamed1053();
+    o.items = buildUnnamed1056();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3445,7 +3485,7 @@
 checkUnsampledReports(api.UnsampledReports o) {
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    checkUnnamed1053(o.items);
+    checkUnnamed1056(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3457,14 +3497,14 @@
   buildCounterUnsampledReports--;
 }
 
-buildUnnamed1054() {
+buildUnnamed1057() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1054(core.List<core.String> o) {
+checkUnnamed1057(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3477,7 +3517,7 @@
   if (buildCounterUpload < 3) {
     o.accountId = "foo";
     o.customDataSourceId = "foo";
-    o.errors = buildUnnamed1054();
+    o.errors = buildUnnamed1057();
     o.id = "foo";
     o.kind = "foo";
     o.status = "foo";
@@ -3492,23 +3532,24 @@
   if (buildCounterUpload < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.customDataSourceId, unittest.equals('foo'));
-    checkUnnamed1054(o.errors);
+    checkUnnamed1057(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    unittest.expect(o.uploadTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.uploadTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterUpload--;
 }
 
-buildUnnamed1055() {
+buildUnnamed1058() {
   var o = new core.List<api.Upload>();
   o.add(buildUpload());
   o.add(buildUpload());
   return o;
 }
 
-checkUnnamed1055(core.List<api.Upload> o) {
+checkUnnamed1058(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpload(o[0]);
   checkUpload(o[1]);
@@ -3519,7 +3560,7 @@
   var o = new api.Uploads();
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    o.items = buildUnnamed1055();
+    o.items = buildUnnamed1058();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3534,7 +3575,7 @@
 checkUploads(api.Uploads o) {
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    checkUnnamed1055(o.items);
+    checkUnnamed1058(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3597,14 +3638,14 @@
   buildCounterWebPropertyRef--;
 }
 
-buildUnnamed1056() {
+buildUnnamed1059() {
   var o = new core.List<api.ProfileSummary>();
   o.add(buildProfileSummary());
   o.add(buildProfileSummary());
   return o;
 }
 
-checkUnnamed1056(core.List<api.ProfileSummary> o) {
+checkUnnamed1059(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileSummary(o[0]);
   checkProfileSummary(o[1]);
@@ -3620,7 +3661,7 @@
     o.kind = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.profiles = buildUnnamed1056();
+    o.profiles = buildUnnamed1059();
     o.starred = true;
     o.websiteUrl = "foo";
   }
@@ -3636,21 +3677,21 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1056(o.profiles);
+    checkUnnamed1059(o.profiles);
     unittest.expect(o.starred, unittest.isTrue);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebPropertySummary--;
 }
 
-buildUnnamed1057() {
+buildUnnamed1060() {
   var o = new core.List<api.Webproperty>();
   o.add(buildWebproperty());
   o.add(buildWebproperty());
   return o;
 }
 
-checkUnnamed1057(core.List<api.Webproperty> o) {
+checkUnnamed1060(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebproperty(o[0]);
   checkWebproperty(o[1]);
@@ -3661,7 +3702,7 @@
   var o = new api.Webproperties();
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    o.items = buildUnnamed1057();
+    o.items = buildUnnamed1060();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3677,7 +3718,7 @@
 checkWebproperties(api.Webproperties o) {
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    checkUnnamed1057(o.items);
+    checkUnnamed1060(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3731,14 +3772,14 @@
   buildCounterWebpropertyParentLink--;
 }
 
-buildUnnamed1058() {
+buildUnnamed1061() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1058(core.List<core.String> o) {
+checkUnnamed1061(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3749,7 +3790,7 @@
   var o = new api.WebpropertyPermissions();
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    o.effective = buildUnnamed1058();
+    o.effective = buildUnnamed1061();
   }
   buildCounterWebpropertyPermissions--;
   return o;
@@ -3758,7 +3799,7 @@
 checkWebpropertyPermissions(api.WebpropertyPermissions o) {
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    checkUnnamed1058(o.effective);
+    checkUnnamed1061(o.effective);
   }
   buildCounterWebpropertyPermissions--;
 }
@@ -3795,7 +3836,8 @@
   if (buildCounterWebproperty < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkWebpropertyChildLink(o.childLink);
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.defaultProfileId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.industryVertical, unittest.equals('foo'));
@@ -3808,13 +3850,13 @@
     unittest.expect(o.profileCount, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.starred, unittest.isTrue);
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebproperty--;
 }
 
-
 main() {
   unittest.group("obj-schema-AccountChildLink", () {
     unittest.test("to-json--from-json", () {
@@ -3824,7 +3866,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AccountPermissions", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccountPermissions();
@@ -3833,7 +3874,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Account", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccount();
@@ -3842,7 +3882,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AccountRef", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccountRef();
@@ -3851,7 +3890,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AccountSummaries", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccountSummaries();
@@ -3860,7 +3898,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AccountSummary", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccountSummary();
@@ -3869,7 +3906,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AccountTicket", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccountTicket();
@@ -3878,7 +3914,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Accounts", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccounts();
@@ -3887,7 +3922,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AdWordsAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildAdWordsAccount();
@@ -3896,16 +3930,15 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyticsDataimportDeleteUploadDataRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyticsDataimportDeleteUploadDataRequest();
-      var od = new api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(o.toJson());
+      var od = new api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(
+          o.toJson());
       checkAnalyticsDataimportDeleteUploadDataRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-Column", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumn();
@@ -3914,7 +3947,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Columns", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumns();
@@ -3923,7 +3955,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDataSourceChildLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDataSourceChildLink();
@@ -3932,7 +3963,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDataSourceParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDataSourceParentLink();
@@ -3941,7 +3971,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDataSource", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDataSource();
@@ -3950,7 +3979,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDataSources", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDataSources();
@@ -3959,7 +3987,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDimensionParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDimensionParentLink();
@@ -3968,7 +3995,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDimension", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDimension();
@@ -3977,7 +4003,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDimensions", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDimensions();
@@ -3986,7 +4011,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomMetricParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomMetricParentLink();
@@ -3995,7 +4019,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomMetric", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomMetric();
@@ -4004,7 +4027,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomMetrics", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomMetrics();
@@ -4013,7 +4035,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityAdWordsLinkEntity", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityAdWordsLinkEntity();
@@ -4022,7 +4043,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityAdWordsLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityAdWordsLink();
@@ -4031,7 +4051,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityAdWordsLinks", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityAdWordsLinks();
@@ -4040,7 +4059,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityUserLinkEntity", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityUserLinkEntity();
@@ -4049,7 +4067,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityUserLinkPermissions", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityUserLinkPermissions();
@@ -4058,7 +4075,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityUserLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityUserLink();
@@ -4067,7 +4083,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityUserLinks", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityUserLinks();
@@ -4076,7 +4091,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExperimentParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperimentParentLink();
@@ -4085,7 +4099,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExperimentVariations", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperimentVariations();
@@ -4094,7 +4107,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Experiment", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperiment();
@@ -4103,7 +4115,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Experiments", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperiments();
@@ -4112,7 +4123,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterAdvancedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterAdvancedDetails();
@@ -4121,7 +4131,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterLowercaseDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterLowercaseDetails();
@@ -4130,7 +4139,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterParentLink();
@@ -4139,7 +4147,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterSearchAndReplaceDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterSearchAndReplaceDetails();
@@ -4148,7 +4155,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterUppercaseDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterUppercaseDetails();
@@ -4157,7 +4163,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Filter", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilter();
@@ -4166,7 +4171,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterExpression", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterExpression();
@@ -4175,7 +4179,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterRef", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterRef();
@@ -4184,7 +4187,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Filters", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilters();
@@ -4193,7 +4195,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataColumnHeaders", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataColumnHeaders();
@@ -4202,7 +4203,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataDataTableCols", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataDataTableCols();
@@ -4211,7 +4211,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataDataTableRowsC", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataDataTableRowsC();
@@ -4220,7 +4219,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataDataTableRows", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataDataTableRows();
@@ -4229,7 +4227,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataDataTable", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataDataTable();
@@ -4238,7 +4235,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataProfileInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataProfileInfo();
@@ -4247,7 +4243,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaDataQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaDataQuery();
@@ -4256,7 +4251,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GaData", () {
     unittest.test("to-json--from-json", () {
       var o = buildGaData();
@@ -4265,7 +4259,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalEventDetailsEventConditions", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalEventDetailsEventConditions();
@@ -4274,7 +4267,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalEventDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalEventDetails();
@@ -4283,7 +4275,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalParentLink();
@@ -4292,7 +4283,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalUrlDestinationDetailsSteps", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalUrlDestinationDetailsSteps();
@@ -4301,7 +4291,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalUrlDestinationDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalUrlDestinationDetails();
@@ -4310,7 +4299,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalVisitNumPagesDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalVisitNumPagesDetails();
@@ -4319,7 +4307,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoalVisitTimeOnSiteDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoalVisitTimeOnSiteDetails();
@@ -4328,7 +4315,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Goal", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoal();
@@ -4337,7 +4323,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Goals", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoals();
@@ -4346,7 +4331,6 @@
     });
   });
 
-
   unittest.group("obj-schema-IncludeConditions", () {
     unittest.test("to-json--from-json", () {
       var o = buildIncludeConditions();
@@ -4355,7 +4339,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LinkedForeignAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildLinkedForeignAccount();
@@ -4364,7 +4347,6 @@
     });
   });
 
-
   unittest.group("obj-schema-McfDataColumnHeaders", () {
     unittest.test("to-json--from-json", () {
       var o = buildMcfDataColumnHeaders();
@@ -4373,7 +4355,6 @@
     });
   });
 
-
   unittest.group("obj-schema-McfDataProfileInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildMcfDataProfileInfo();
@@ -4382,7 +4363,6 @@
     });
   });
 
-
   unittest.group("obj-schema-McfDataQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildMcfDataQuery();
@@ -4391,7 +4371,6 @@
     });
   });
 
-
   unittest.group("obj-schema-McfDataRowsConversionPathValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildMcfDataRowsConversionPathValue();
@@ -4400,7 +4379,6 @@
     });
   });
 
-
   unittest.group("obj-schema-McfDataRows", () {
     unittest.test("to-json--from-json", () {
       var o = buildMcfDataRows();
@@ -4409,7 +4387,6 @@
     });
   });
 
-
   unittest.group("obj-schema-McfData", () {
     unittest.test("to-json--from-json", () {
       var o = buildMcfData();
@@ -4418,7 +4395,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileChildLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileChildLink();
@@ -4427,7 +4403,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileParentLink();
@@ -4436,7 +4411,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfilePermissions", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfilePermissions();
@@ -4445,7 +4419,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Profile", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfile();
@@ -4454,7 +4427,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileFilterLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileFilterLink();
@@ -4463,7 +4435,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileFilterLinks", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileFilterLinks();
@@ -4472,7 +4443,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileRef", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileRef();
@@ -4481,7 +4451,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileSummary", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileSummary();
@@ -4490,7 +4459,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Profiles", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfiles();
@@ -4499,7 +4467,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RealtimeDataColumnHeaders", () {
     unittest.test("to-json--from-json", () {
       var o = buildRealtimeDataColumnHeaders();
@@ -4508,7 +4475,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RealtimeDataProfileInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildRealtimeDataProfileInfo();
@@ -4517,7 +4483,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RealtimeDataQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildRealtimeDataQuery();
@@ -4526,7 +4491,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RealtimeData", () {
     unittest.test("to-json--from-json", () {
       var o = buildRealtimeData();
@@ -4535,34 +4499,38 @@
     });
   });
 
-
   unittest.group("obj-schema-RemarketingAudienceAudienceDefinition", () {
     unittest.test("to-json--from-json", () {
       var o = buildRemarketingAudienceAudienceDefinition();
-      var od = new api.RemarketingAudienceAudienceDefinition.fromJson(o.toJson());
+      var od =
+          new api.RemarketingAudienceAudienceDefinition.fromJson(o.toJson());
       checkRemarketingAudienceAudienceDefinition(od);
     });
   });
 
-
-  unittest.group("obj-schema-RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions", () {
+  unittest.group(
+      "obj-schema-RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions",
+      () {
     unittest.test("to-json--from-json", () {
-      var o = buildRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
-      var od = new api.RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions.fromJson(o.toJson());
+      var o =
+          buildRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
+      var od = new api
+              .RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions.fromJson(
+          o.toJson());
       checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(od);
     });
   });
 
-
-  unittest.group("obj-schema-RemarketingAudienceStateBasedAudienceDefinition", () {
+  unittest.group("obj-schema-RemarketingAudienceStateBasedAudienceDefinition",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildRemarketingAudienceStateBasedAudienceDefinition();
-      var od = new api.RemarketingAudienceStateBasedAudienceDefinition.fromJson(o.toJson());
+      var od = new api.RemarketingAudienceStateBasedAudienceDefinition.fromJson(
+          o.toJson());
       checkRemarketingAudienceStateBasedAudienceDefinition(od);
     });
   });
 
-
   unittest.group("obj-schema-RemarketingAudience", () {
     unittest.test("to-json--from-json", () {
       var o = buildRemarketingAudience();
@@ -4571,7 +4539,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RemarketingAudiences", () {
     unittest.test("to-json--from-json", () {
       var o = buildRemarketingAudiences();
@@ -4580,7 +4547,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Segment", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegment();
@@ -4589,7 +4555,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Segments", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegments();
@@ -4598,16 +4563,15 @@
     });
   });
 
-
   unittest.group("obj-schema-UnsampledReportCloudStorageDownloadDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildUnsampledReportCloudStorageDownloadDetails();
-      var od = new api.UnsampledReportCloudStorageDownloadDetails.fromJson(o.toJson());
+      var od = new api.UnsampledReportCloudStorageDownloadDetails.fromJson(
+          o.toJson());
       checkUnsampledReportCloudStorageDownloadDetails(od);
     });
   });
 
-
   unittest.group("obj-schema-UnsampledReportDriveDownloadDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildUnsampledReportDriveDownloadDetails();
@@ -4616,7 +4580,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UnsampledReport", () {
     unittest.test("to-json--from-json", () {
       var o = buildUnsampledReport();
@@ -4625,7 +4588,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UnsampledReports", () {
     unittest.test("to-json--from-json", () {
       var o = buildUnsampledReports();
@@ -4634,7 +4596,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Upload", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpload();
@@ -4643,7 +4604,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Uploads", () {
     unittest.test("to-json--from-json", () {
       var o = buildUploads();
@@ -4652,7 +4612,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserRef", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserRef();
@@ -4661,7 +4620,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebPropertyRef", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebPropertyRef();
@@ -4670,7 +4628,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebPropertySummary", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebPropertySummary();
@@ -4679,7 +4636,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Webproperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebproperties();
@@ -4688,7 +4644,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebpropertyChildLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebpropertyChildLink();
@@ -4697,7 +4652,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebpropertyParentLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebpropertyParentLink();
@@ -4706,7 +4660,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebpropertyPermissions", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebpropertyPermissions();
@@ -4715,7 +4668,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Webproperty", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebproperty();
@@ -4724,10 +4676,8 @@
     });
   });
 
-
   unittest.group("resource-DataGaResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DataGaResourceApi res = new api.AnalyticsApi(mock).data.ga;
       var arg_ids = "foo";
@@ -4748,11 +4698,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("data/ga"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("data/ga"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -4765,44 +4718,63 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["ids"].first, unittest.equals(arg_ids));
-        unittest.expect(queryMap["start-date"].first, unittest.equals(arg_start_date));
-        unittest.expect(queryMap["end-date"].first, unittest.equals(arg_end_date));
-        unittest.expect(queryMap["metrics"].first, unittest.equals(arg_metrics));
-        unittest.expect(queryMap["dimensions"].first, unittest.equals(arg_dimensions));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(queryMap["include-empty-rows"].first, unittest.equals("$arg_include_empty_rows"));
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
+        unittest.expect(
+            queryMap["start-date"].first, unittest.equals(arg_start_date));
+        unittest.expect(
+            queryMap["end-date"].first, unittest.equals(arg_end_date));
+        unittest.expect(
+            queryMap["metrics"].first, unittest.equals(arg_metrics));
+        unittest.expect(
+            queryMap["dimensions"].first, unittest.equals(arg_dimensions));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(queryMap["include-empty-rows"].first,
+            unittest.equals("$arg_include_empty_rows"));
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
         unittest.expect(queryMap["output"].first, unittest.equals(arg_output));
-        unittest.expect(queryMap["samplingLevel"].first, unittest.equals(arg_samplingLevel));
-        unittest.expect(queryMap["segment"].first, unittest.equals(arg_segment));
+        unittest.expect(queryMap["samplingLevel"].first,
+            unittest.equals(arg_samplingLevel));
+        unittest.expect(
+            queryMap["segment"].first, unittest.equals(arg_segment));
         unittest.expect(queryMap["sort"].first, unittest.equals(arg_sort));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGaData());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_ids, arg_start_date, arg_end_date, arg_metrics, dimensions: arg_dimensions, filters: arg_filters, include_empty_rows: arg_include_empty_rows, max_results: arg_max_results, output: arg_output, samplingLevel: arg_samplingLevel, segment: arg_segment, sort: arg_sort, start_index: arg_start_index).then(unittest.expectAsync1(((api.GaData response) {
+      res
+          .get(arg_ids, arg_start_date, arg_end_date, arg_metrics,
+              dimensions: arg_dimensions,
+              filters: arg_filters,
+              include_empty_rows: arg_include_empty_rows,
+              max_results: arg_max_results,
+              output: arg_output,
+              samplingLevel: arg_samplingLevel,
+              segment: arg_segment,
+              sort: arg_sort,
+              start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.GaData response) {
         checkGaData(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DataMcfResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DataMcfResourceApi res = new api.AnalyticsApi(mock).data.mcf;
       var arg_ids = "foo";
@@ -4820,11 +4792,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("data/mcf"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("data/mcf"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4837,43 +4812,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["ids"].first, unittest.equals(arg_ids));
-        unittest.expect(queryMap["start-date"].first, unittest.equals(arg_start_date));
-        unittest.expect(queryMap["end-date"].first, unittest.equals(arg_end_date));
-        unittest.expect(queryMap["metrics"].first, unittest.equals(arg_metrics));
-        unittest.expect(queryMap["dimensions"].first, unittest.equals(arg_dimensions));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(queryMap["samplingLevel"].first, unittest.equals(arg_samplingLevel));
+        unittest.expect(
+            queryMap["start-date"].first, unittest.equals(arg_start_date));
+        unittest.expect(
+            queryMap["end-date"].first, unittest.equals(arg_end_date));
+        unittest.expect(
+            queryMap["metrics"].first, unittest.equals(arg_metrics));
+        unittest.expect(
+            queryMap["dimensions"].first, unittest.equals(arg_dimensions));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(queryMap["samplingLevel"].first,
+            unittest.equals(arg_samplingLevel));
         unittest.expect(queryMap["sort"].first, unittest.equals(arg_sort));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMcfData());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_ids, arg_start_date, arg_end_date, arg_metrics, dimensions: arg_dimensions, filters: arg_filters, max_results: arg_max_results, samplingLevel: arg_samplingLevel, sort: arg_sort, start_index: arg_start_index).then(unittest.expectAsync1(((api.McfData response) {
+      res
+          .get(arg_ids, arg_start_date, arg_end_date, arg_metrics,
+              dimensions: arg_dimensions,
+              filters: arg_filters,
+              max_results: arg_max_results,
+              samplingLevel: arg_samplingLevel,
+              sort: arg_sort,
+              start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.McfData response) {
         checkMcfData(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DataRealtimeResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.DataRealtimeResourceApi res = new api.AnalyticsApi(mock).data.realtime;
+      api.DataRealtimeResourceApi res =
+          new api.AnalyticsApi(mock).data.realtime;
       var arg_ids = "foo";
       var arg_metrics = "foo";
       var arg_dimensions = "foo";
@@ -4885,11 +4875,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("data/realtime"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("data/realtime"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -4902,39 +4895,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["ids"].first, unittest.equals(arg_ids));
-        unittest.expect(queryMap["metrics"].first, unittest.equals(arg_metrics));
-        unittest.expect(queryMap["dimensions"].first, unittest.equals(arg_dimensions));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
+        unittest.expect(
+            queryMap["metrics"].first, unittest.equals(arg_metrics));
+        unittest.expect(
+            queryMap["dimensions"].first, unittest.equals(arg_dimensions));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
         unittest.expect(queryMap["sort"].first, unittest.equals(arg_sort));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRealtimeData());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_ids, arg_metrics, dimensions: arg_dimensions, filters: arg_filters, max_results: arg_max_results, sort: arg_sort).then(unittest.expectAsync1(((api.RealtimeData response) {
+      res
+          .get(arg_ids, arg_metrics,
+              dimensions: arg_dimensions,
+              filters: arg_filters,
+              max_results: arg_max_results,
+              sort: arg_sort)
+          .then(unittest.expectAsync1(((api.RealtimeData response) {
         checkRealtimeData(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementAccountSummariesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementAccountSummariesResourceApi res = new api.AnalyticsApi(mock).management.accountSummaries;
+      api.ManagementAccountSummariesResourceApi res =
+          new api.AnalyticsApi(mock).management.accountSummaries;
       var arg_max_results = 42;
       var arg_start_index = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4942,11 +4944,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("management/accountSummaries"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 27),
+            unittest.equals("management/accountSummaries"));
         pathOffset += 27;
 
         var query = (req.url).query;
@@ -4959,35 +4964,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAccountSummaries());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.AccountSummaries response) {
+      res
+          .list(max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.AccountSummaries response) {
         checkAccountSummaries(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementAccountUserLinksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementAccountUserLinksResourceApi res = new api.AnalyticsApi(mock).management.accountUserLinks;
+      api.ManagementAccountUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.accountUserLinks;
       var arg_accountId = "foo";
       var arg_linkId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4995,18 +5003,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/entityUserLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/entityUserLinks/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5022,16 +5035,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -5040,9 +5054,9 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementAccountUserLinksResourceApi res = new api.AnalyticsApi(mock).management.accountUserLinks;
+      api.ManagementAccountUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.accountUserLinks;
       var arg_request = buildEntityUserLink();
       var arg_accountId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5053,18 +5067,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/entityUserLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/entityUserLinks"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -5077,29 +5096,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId).then(unittest.expectAsync1(((api.EntityUserLink response) {
+      res
+          .insert(arg_request, arg_accountId)
+          .then(unittest.expectAsync1(((api.EntityUserLink response) {
         checkEntityUserLink(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementAccountUserLinksResourceApi res = new api.AnalyticsApi(mock).management.accountUserLinks;
+      api.ManagementAccountUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.accountUserLinks;
       var arg_accountId = "foo";
       var arg_max_results = 42;
       var arg_start_index = 42;
@@ -5108,18 +5130,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/entityUserLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/entityUserLinks"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -5132,31 +5159,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLinks());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.EntityUserLinks response) {
+      res
+          .list(arg_accountId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.EntityUserLinks response) {
         checkEntityUserLinks(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementAccountUserLinksResourceApi res = new api.AnalyticsApi(mock).management.accountUserLinks;
+      api.ManagementAccountUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.accountUserLinks;
       var arg_request = buildEntityUserLink();
       var arg_accountId = "foo";
       var arg_linkId = "foo";
@@ -5168,18 +5201,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/entityUserLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/entityUserLinks/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5195,33 +5233,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_linkId).then(unittest.expectAsync1(((api.EntityUserLink response) {
+      res
+          .update(arg_request, arg_accountId, arg_linkId)
+          .then(unittest.expectAsync1(((api.EntityUserLink response) {
         checkEntityUserLink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementAccountsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementAccountsResourceApi res = new api.AnalyticsApi(mock).management.accounts;
+      api.ManagementAccountsResourceApi res =
+          new api.AnalyticsApi(mock).management.accounts;
       var arg_max_results = 42;
       var arg_start_index = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5229,11 +5268,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("management/accounts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("management/accounts"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -5246,35 +5288,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAccounts());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Accounts response) {
+      res
+          .list(max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Accounts response) {
         checkAccounts(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementCustomDataSourcesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomDataSourcesResourceApi res = new api.AnalyticsApi(mock).management.customDataSources;
+      api.ManagementCustomDataSourcesResourceApi res =
+          new api.AnalyticsApi(mock).management.customDataSources;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -5284,25 +5329,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDataSources", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/customDataSources"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/customDataSources"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -5315,35 +5367,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomDataSources());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.CustomDataSources response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.CustomDataSources response) {
         checkCustomDataSources(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementCustomDimensionsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomDimensionsResourceApi res = new api.AnalyticsApi(mock).management.customDimensions;
+      api.ManagementCustomDimensionsResourceApi res =
+          new api.AnalyticsApi(mock).management.customDimensions;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_customDimensionId = "foo";
@@ -5352,25 +5408,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDimensions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/customDimensions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/customDimensions/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5386,29 +5449,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomDimension());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_customDimensionId).then(unittest.expectAsync1(((api.CustomDimension response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_customDimensionId)
+          .then(unittest.expectAsync1(((api.CustomDimension response) {
         checkCustomDimension(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomDimensionsResourceApi res = new api.AnalyticsApi(mock).management.customDimensions;
+      api.ManagementCustomDimensionsResourceApi res =
+          new api.AnalyticsApi(mock).management.customDimensions;
       var arg_request = buildCustomDimension();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -5420,25 +5486,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDimensions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/customDimensions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/customDimensions"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -5451,29 +5524,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomDimension());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.CustomDimension response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.CustomDimension response) {
         checkCustomDimension(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomDimensionsResourceApi res = new api.AnalyticsApi(mock).management.customDimensions;
+      api.ManagementCustomDimensionsResourceApi res =
+          new api.AnalyticsApi(mock).management.customDimensions;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -5483,25 +5559,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDimensions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/customDimensions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/customDimensions"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -5514,31 +5597,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomDimensions());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.CustomDimensions response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.CustomDimensions response) {
         checkCustomDimensions(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomDimensionsResourceApi res = new api.AnalyticsApi(mock).management.customDimensions;
+      api.ManagementCustomDimensionsResourceApi res =
+          new api.AnalyticsApi(mock).management.customDimensions;
       var arg_request = buildCustomDimension();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -5552,25 +5641,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDimensions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/customDimensions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/customDimensions/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5586,30 +5682,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first, unittest.equals("$arg_ignoreCustomDataSourceLinks"));
-
+        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first,
+            unittest.equals("$arg_ignoreCustomDataSourceLinks"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomDimension());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_customDimensionId, ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks).then(unittest.expectAsync1(((api.CustomDimension response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId,
+              arg_customDimensionId,
+              ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks)
+          .then(unittest.expectAsync1(((api.CustomDimension response) {
         checkCustomDimension(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomDimensionsResourceApi res = new api.AnalyticsApi(mock).management.customDimensions;
+      api.ManagementCustomDimensionsResourceApi res =
+          new api.AnalyticsApi(mock).management.customDimensions;
       var arg_request = buildCustomDimension();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -5623,25 +5725,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDimensions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/customDimensions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/customDimensions/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5657,34 +5766,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first, unittest.equals("$arg_ignoreCustomDataSourceLinks"));
-
+        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first,
+            unittest.equals("$arg_ignoreCustomDataSourceLinks"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomDimension());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_customDimensionId, ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks).then(unittest.expectAsync1(((api.CustomDimension response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId,
+              arg_customDimensionId,
+              ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks)
+          .then(unittest.expectAsync1(((api.CustomDimension response) {
         checkCustomDimension(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementCustomMetricsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomMetricsResourceApi res = new api.AnalyticsApi(mock).management.customMetrics;
+      api.ManagementCustomMetricsResourceApi res =
+          new api.AnalyticsApi(mock).management.customMetrics;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_customMetricId = "foo";
@@ -5693,25 +5806,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customMetrics/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/customMetrics/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/customMetrics/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5727,29 +5847,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_customMetricId).then(unittest.expectAsync1(((api.CustomMetric response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_customMetricId)
+          .then(unittest.expectAsync1(((api.CustomMetric response) {
         checkCustomMetric(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomMetricsResourceApi res = new api.AnalyticsApi(mock).management.customMetrics;
+      api.ManagementCustomMetricsResourceApi res =
+          new api.AnalyticsApi(mock).management.customMetrics;
       var arg_request = buildCustomMetric();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -5761,25 +5884,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customMetrics", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/customMetrics"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/customMetrics"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -5792,29 +5922,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.CustomMetric response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.CustomMetric response) {
         checkCustomMetric(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomMetricsResourceApi res = new api.AnalyticsApi(mock).management.customMetrics;
+      api.ManagementCustomMetricsResourceApi res =
+          new api.AnalyticsApi(mock).management.customMetrics;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -5824,25 +5957,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customMetrics", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/customMetrics"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/customMetrics"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -5855,31 +5995,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomMetrics());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.CustomMetrics response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.CustomMetrics response) {
         checkCustomMetrics(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomMetricsResourceApi res = new api.AnalyticsApi(mock).management.customMetrics;
+      api.ManagementCustomMetricsResourceApi res =
+          new api.AnalyticsApi(mock).management.customMetrics;
       var arg_request = buildCustomMetric();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -5893,25 +6039,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customMetrics/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/customMetrics/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/customMetrics/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5927,30 +6080,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first, unittest.equals("$arg_ignoreCustomDataSourceLinks"));
-
+        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first,
+            unittest.equals("$arg_ignoreCustomDataSourceLinks"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_customMetricId, ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks).then(unittest.expectAsync1(((api.CustomMetric response) {
+      res
+          .patch(
+              arg_request, arg_accountId, arg_webPropertyId, arg_customMetricId,
+              ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks)
+          .then(unittest.expectAsync1(((api.CustomMetric response) {
         checkCustomMetric(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementCustomMetricsResourceApi res = new api.AnalyticsApi(mock).management.customMetrics;
+      api.ManagementCustomMetricsResourceApi res =
+          new api.AnalyticsApi(mock).management.customMetrics;
       var arg_request = buildCustomMetric();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -5964,25 +6123,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customMetrics/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/customMetrics/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/customMetrics/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5998,34 +6164,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first, unittest.equals("$arg_ignoreCustomDataSourceLinks"));
-
+        unittest.expect(queryMap["ignoreCustomDataSourceLinks"].first,
+            unittest.equals("$arg_ignoreCustomDataSourceLinks"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_customMetricId, ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks).then(unittest.expectAsync1(((api.CustomMetric response) {
+      res
+          .update(
+              arg_request, arg_accountId, arg_webPropertyId, arg_customMetricId,
+              ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks)
+          .then(unittest.expectAsync1(((api.CustomMetric response) {
         checkCustomMetric(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementExperimentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementExperimentsResourceApi res = new api.AnalyticsApi(mock).management.experiments;
+      api.ManagementExperimentsResourceApi res =
+          new api.AnalyticsApi(mock).management.experiments;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -6035,32 +6205,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/experiments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/experiments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/experiments/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6076,27 +6255,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(
+              arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementExperimentsResourceApi res = new api.AnalyticsApi(mock).management.experiments;
+      api.ManagementExperimentsResourceApi res =
+          new api.AnalyticsApi(mock).management.experiments;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -6106,32 +6289,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/experiments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/experiments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/experiments/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6147,29 +6339,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExperiment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId).then(unittest.expectAsync1(((api.Experiment response) {
+      res
+          .get(
+              arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId)
+          .then(unittest.expectAsync1(((api.Experiment response) {
         checkExperiment(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementExperimentsResourceApi res = new api.AnalyticsApi(mock).management.experiments;
+      api.ManagementExperimentsResourceApi res =
+          new api.AnalyticsApi(mock).management.experiments;
       var arg_request = buildExperiment();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -6182,32 +6378,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/experiments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/experiments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/experiments"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -6220,29 +6425,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExperiment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.Experiment response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.Experiment response) {
         checkExperiment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementExperimentsResourceApi res = new api.AnalyticsApi(mock).management.experiments;
+      api.ManagementExperimentsResourceApi res =
+          new api.AnalyticsApi(mock).management.experiments;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -6253,32 +6461,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/experiments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/experiments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/experiments"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -6291,31 +6508,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExperiments());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, arg_profileId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Experiments response) {
+      res
+          .list(arg_accountId, arg_webPropertyId, arg_profileId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Experiments response) {
         checkExperiments(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementExperimentsResourceApi res = new api.AnalyticsApi(mock).management.experiments;
+      api.ManagementExperimentsResourceApi res =
+          new api.AnalyticsApi(mock).management.experiments;
       var arg_request = buildExperiment();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -6329,32 +6552,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/experiments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/experiments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/experiments/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6370,29 +6602,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExperiment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId).then(unittest.expectAsync1(((api.Experiment response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_experimentId)
+          .then(unittest.expectAsync1(((api.Experiment response) {
         checkExperiment(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementExperimentsResourceApi res = new api.AnalyticsApi(mock).management.experiments;
+      api.ManagementExperimentsResourceApi res =
+          new api.AnalyticsApi(mock).management.experiments;
       var arg_request = buildExperiment();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -6406,32 +6642,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/experiments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/experiments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/experiments/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6447,33 +6692,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExperiment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId).then(unittest.expectAsync1(((api.Experiment response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_experimentId)
+          .then(unittest.expectAsync1(((api.Experiment response) {
         checkExperiment(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementFiltersResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementFiltersResourceApi res = new api.AnalyticsApi(mock).management.filters;
+      api.ManagementFiltersResourceApi res =
+          new api.AnalyticsApi(mock).management.filters;
       var arg_accountId = "foo";
       var arg_filterId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6481,18 +6728,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/filters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/filters/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6508,29 +6760,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFilter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_filterId).then(unittest.expectAsync1(((api.Filter response) {
+      res
+          .delete(arg_accountId, arg_filterId)
+          .then(unittest.expectAsync1(((api.Filter response) {
         checkFilter(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementFiltersResourceApi res = new api.AnalyticsApi(mock).management.filters;
+      api.ManagementFiltersResourceApi res =
+          new api.AnalyticsApi(mock).management.filters;
       var arg_accountId = "foo";
       var arg_filterId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6538,18 +6793,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/filters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/filters/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6565,29 +6825,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFilter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_filterId).then(unittest.expectAsync1(((api.Filter response) {
+      res
+          .get(arg_accountId, arg_filterId)
+          .then(unittest.expectAsync1(((api.Filter response) {
         checkFilter(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementFiltersResourceApi res = new api.AnalyticsApi(mock).management.filters;
+      api.ManagementFiltersResourceApi res =
+          new api.AnalyticsApi(mock).management.filters;
       var arg_request = buildFilter();
       var arg_accountId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6598,18 +6861,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/filters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/filters"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -6622,29 +6890,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFilter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId).then(unittest.expectAsync1(((api.Filter response) {
+      res
+          .insert(arg_request, arg_accountId)
+          .then(unittest.expectAsync1(((api.Filter response) {
         checkFilter(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementFiltersResourceApi res = new api.AnalyticsApi(mock).management.filters;
+      api.ManagementFiltersResourceApi res =
+          new api.AnalyticsApi(mock).management.filters;
       var arg_accountId = "foo";
       var arg_max_results = 42;
       var arg_start_index = 42;
@@ -6653,18 +6924,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/filters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/filters"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -6677,31 +6953,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFilters());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Filters response) {
+      res
+          .list(arg_accountId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Filters response) {
         checkFilters(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementFiltersResourceApi res = new api.AnalyticsApi(mock).management.filters;
+      api.ManagementFiltersResourceApi res =
+          new api.AnalyticsApi(mock).management.filters;
       var arg_request = buildFilter();
       var arg_accountId = "foo";
       var arg_filterId = "foo";
@@ -6713,18 +6995,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/filters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/filters/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6740,29 +7027,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFilter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_filterId).then(unittest.expectAsync1(((api.Filter response) {
+      res
+          .patch(arg_request, arg_accountId, arg_filterId)
+          .then(unittest.expectAsync1(((api.Filter response) {
         checkFilter(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementFiltersResourceApi res = new api.AnalyticsApi(mock).management.filters;
+      api.ManagementFiltersResourceApi res =
+          new api.AnalyticsApi(mock).management.filters;
       var arg_request = buildFilter();
       var arg_accountId = "foo";
       var arg_filterId = "foo";
@@ -6774,18 +7064,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/filters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/filters/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6801,33 +7096,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFilter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_filterId).then(unittest.expectAsync1(((api.Filter response) {
+      res
+          .update(arg_request, arg_accountId, arg_filterId)
+          .then(unittest.expectAsync1(((api.Filter response) {
         checkFilter(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementGoalsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementGoalsResourceApi res = new api.AnalyticsApi(mock).management.goals;
+      api.ManagementGoalsResourceApi res =
+          new api.AnalyticsApi(mock).management.goals;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -6837,32 +7133,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/goals/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/goals/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/goals/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6878,29 +7183,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoal());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_profileId, arg_goalId).then(unittest.expectAsync1(((api.Goal response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_profileId, arg_goalId)
+          .then(unittest.expectAsync1(((api.Goal response) {
         checkGoal(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementGoalsResourceApi res = new api.AnalyticsApi(mock).management.goals;
+      api.ManagementGoalsResourceApi res =
+          new api.AnalyticsApi(mock).management.goals;
       var arg_request = buildGoal();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -6913,32 +7221,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/goals", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/goals"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/goals"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -6951,29 +7268,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoal());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.Goal response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.Goal response) {
         checkGoal(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementGoalsResourceApi res = new api.AnalyticsApi(mock).management.goals;
+      api.ManagementGoalsResourceApi res =
+          new api.AnalyticsApi(mock).management.goals;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -6984,32 +7304,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/goals", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/goals"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/goals"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -7022,31 +7351,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoals());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, arg_profileId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Goals response) {
+      res
+          .list(arg_accountId, arg_webPropertyId, arg_profileId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Goals response) {
         checkGoals(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementGoalsResourceApi res = new api.AnalyticsApi(mock).management.goals;
+      api.ManagementGoalsResourceApi res =
+          new api.AnalyticsApi(mock).management.goals;
       var arg_request = buildGoal();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7060,32 +7395,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/goals/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/goals/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/goals/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7101,29 +7445,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoal());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_goalId).then(unittest.expectAsync1(((api.Goal response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_goalId)
+          .then(unittest.expectAsync1(((api.Goal response) {
         checkGoal(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementGoalsResourceApi res = new api.AnalyticsApi(mock).management.goals;
+      api.ManagementGoalsResourceApi res =
+          new api.AnalyticsApi(mock).management.goals;
       var arg_request = buildGoal();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7137,32 +7485,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/goals/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/goals/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/goals/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7178,33 +7535,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoal());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_goalId).then(unittest.expectAsync1(((api.Goal response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_goalId)
+          .then(unittest.expectAsync1(((api.Goal response) {
         checkGoal(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementProfileFilterLinksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileFilterLinksResourceApi res = new api.AnalyticsApi(mock).management.profileFilterLinks;
+      api.ManagementProfileFilterLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileFilterLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -7214,32 +7573,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/profileFilterLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/profileFilterLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/profileFilterLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7255,27 +7623,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileFilterLinksResourceApi res = new api.AnalyticsApi(mock).management.profileFilterLinks;
+      api.ManagementProfileFilterLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileFilterLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -7285,32 +7656,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/profileFilterLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/profileFilterLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/profileFilterLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7326,29 +7706,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfileFilterLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId).then(unittest.expectAsync1(((api.ProfileFilterLink response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId)
+          .then(unittest.expectAsync1(((api.ProfileFilterLink response) {
         checkProfileFilterLink(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileFilterLinksResourceApi res = new api.AnalyticsApi(mock).management.profileFilterLinks;
+      api.ManagementProfileFilterLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileFilterLinks;
       var arg_request = buildProfileFilterLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7361,32 +7744,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/profileFilterLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/profileFilterLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/profileFilterLinks"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -7399,29 +7791,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfileFilterLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.ProfileFilterLink response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.ProfileFilterLink response) {
         checkProfileFilterLink(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileFilterLinksResourceApi res = new api.AnalyticsApi(mock).management.profileFilterLinks;
+      api.ManagementProfileFilterLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileFilterLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -7432,32 +7827,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/profileFilterLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/profileFilterLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/profileFilterLinks"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -7470,31 +7874,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfileFilterLinks());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, arg_profileId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.ProfileFilterLinks response) {
+      res
+          .list(arg_accountId, arg_webPropertyId, arg_profileId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.ProfileFilterLinks response) {
         checkProfileFilterLinks(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileFilterLinksResourceApi res = new api.AnalyticsApi(mock).management.profileFilterLinks;
+      api.ManagementProfileFilterLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileFilterLinks;
       var arg_request = buildProfileFilterLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7508,32 +7918,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/profileFilterLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/profileFilterLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/profileFilterLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7549,29 +7968,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfileFilterLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId).then(unittest.expectAsync1(((api.ProfileFilterLink response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_linkId)
+          .then(unittest.expectAsync1(((api.ProfileFilterLink response) {
         checkProfileFilterLink(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileFilterLinksResourceApi res = new api.AnalyticsApi(mock).management.profileFilterLinks;
+      api.ManagementProfileFilterLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileFilterLinks;
       var arg_request = buildProfileFilterLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7585,32 +8008,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/profileFilterLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/profileFilterLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/profileFilterLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7626,33 +8058,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfileFilterLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId).then(unittest.expectAsync1(((api.ProfileFilterLink response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_linkId)
+          .then(unittest.expectAsync1(((api.ProfileFilterLink response) {
         checkProfileFilterLink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementProfileUserLinksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileUserLinksResourceApi res = new api.AnalyticsApi(mock).management.profileUserLinks;
+      api.ManagementProfileUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileUserLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -7662,32 +8096,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/entityUserLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/entityUserLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/entityUserLinks/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7703,27 +8146,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileUserLinksResourceApi res = new api.AnalyticsApi(mock).management.profileUserLinks;
+      api.ManagementProfileUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileUserLinks;
       var arg_request = buildEntityUserLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7736,32 +8182,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/entityUserLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/entityUserLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/entityUserLinks"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -7774,29 +8229,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.EntityUserLink response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.EntityUserLink response) {
         checkEntityUserLink(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileUserLinksResourceApi res = new api.AnalyticsApi(mock).management.profileUserLinks;
+      api.ManagementProfileUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileUserLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -7807,32 +8265,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/entityUserLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/entityUserLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/entityUserLinks"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -7845,31 +8312,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLinks());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, arg_profileId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.EntityUserLinks response) {
+      res
+          .list(arg_accountId, arg_webPropertyId, arg_profileId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.EntityUserLinks response) {
         checkEntityUserLinks(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfileUserLinksResourceApi res = new api.AnalyticsApi(mock).management.profileUserLinks;
+      api.ManagementProfileUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.profileUserLinks;
       var arg_request = buildEntityUserLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -7883,32 +8356,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/entityUserLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/entityUserLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/entityUserLinks/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7924,33 +8406,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId).then(unittest.expectAsync1(((api.EntityUserLink response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_linkId)
+          .then(unittest.expectAsync1(((api.EntityUserLink response) {
         checkEntityUserLink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementProfilesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfilesResourceApi res = new api.AnalyticsApi(mock).management.profiles;
+      api.ManagementProfilesResourceApi res =
+          new api.AnalyticsApi(mock).management.profiles;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -7959,25 +8443,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7993,27 +8484,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfilesResourceApi res = new api.AnalyticsApi(mock).management.profiles;
+      api.ManagementProfilesResourceApi res =
+          new api.AnalyticsApi(mock).management.profiles;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -8022,25 +8516,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8056,29 +8557,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.Profile response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.Profile response) {
         checkProfile(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfilesResourceApi res = new api.AnalyticsApi(mock).management.profiles;
+      api.ManagementProfilesResourceApi res =
+          new api.AnalyticsApi(mock).management.profiles;
       var arg_request = buildProfile();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8090,25 +8594,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/profiles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/profiles"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -8121,29 +8632,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.Profile response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.Profile response) {
         checkProfile(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfilesResourceApi res = new api.AnalyticsApi(mock).management.profiles;
+      api.ManagementProfilesResourceApi res =
+          new api.AnalyticsApi(mock).management.profiles;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -8153,25 +8667,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/profiles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/profiles"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -8184,31 +8705,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfiles());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Profiles response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Profiles response) {
         checkProfiles(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfilesResourceApi res = new api.AnalyticsApi(mock).management.profiles;
+      api.ManagementProfilesResourceApi res =
+          new api.AnalyticsApi(mock).management.profiles;
       var arg_request = buildProfile();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8221,25 +8748,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8255,29 +8789,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.Profile response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.Profile response) {
         checkProfile(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementProfilesResourceApi res = new api.AnalyticsApi(mock).management.profiles;
+      api.ManagementProfilesResourceApi res =
+          new api.AnalyticsApi(mock).management.profiles;
       var arg_request = buildProfile();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8290,25 +8827,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8324,33 +8868,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProfile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.Profile response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.Profile response) {
         checkProfile(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementRemarketingAudienceResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementRemarketingAudienceResourceApi res = new api.AnalyticsApi(mock).management.remarketingAudience;
+      api.ManagementRemarketingAudienceResourceApi res =
+          new api.AnalyticsApi(mock).management.remarketingAudience;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_remarketingAudienceId = "foo";
@@ -8359,25 +8904,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/remarketingAudiences/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/remarketingAudiences/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/remarketingAudiences/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8393,27 +8945,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_remarketingAudienceId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_accountId, arg_webPropertyId, arg_remarketingAudienceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementRemarketingAudienceResourceApi res = new api.AnalyticsApi(mock).management.remarketingAudience;
+      api.ManagementRemarketingAudienceResourceApi res =
+          new api.AnalyticsApi(mock).management.remarketingAudience;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_remarketingAudienceId = "foo";
@@ -8422,25 +8977,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/remarketingAudiences/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/remarketingAudiences/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/remarketingAudiences/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8456,29 +9018,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRemarketingAudience());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_remarketingAudienceId).then(unittest.expectAsync1(((api.RemarketingAudience response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_remarketingAudienceId)
+          .then(unittest.expectAsync1(((api.RemarketingAudience response) {
         checkRemarketingAudience(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementRemarketingAudienceResourceApi res = new api.AnalyticsApi(mock).management.remarketingAudience;
+      api.ManagementRemarketingAudienceResourceApi res =
+          new api.AnalyticsApi(mock).management.remarketingAudience;
       var arg_request = buildRemarketingAudience();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8490,25 +9055,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/remarketingAudiences", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/remarketingAudiences"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/remarketingAudiences"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -8521,29 +9093,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRemarketingAudience());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.RemarketingAudience response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.RemarketingAudience response) {
         checkRemarketingAudience(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementRemarketingAudienceResourceApi res = new api.AnalyticsApi(mock).management.remarketingAudience;
+      api.ManagementRemarketingAudienceResourceApi res =
+          new api.AnalyticsApi(mock).management.remarketingAudience;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -8554,25 +9129,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/remarketingAudiences", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/remarketingAudiences"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("/remarketingAudiences"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -8585,32 +9167,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
         unittest.expect(queryMap["type"].first, unittest.equals(arg_type));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRemarketingAudiences());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index, type: arg_type).then(unittest.expectAsync1(((api.RemarketingAudiences response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results,
+              start_index: arg_start_index,
+              type: arg_type)
+          .then(unittest.expectAsync1(((api.RemarketingAudiences response) {
         checkRemarketingAudiences(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementRemarketingAudienceResourceApi res = new api.AnalyticsApi(mock).management.remarketingAudience;
+      api.ManagementRemarketingAudienceResourceApi res =
+          new api.AnalyticsApi(mock).management.remarketingAudience;
       var arg_request = buildRemarketingAudience();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8623,25 +9213,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/remarketingAudiences/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/remarketingAudiences/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/remarketingAudiences/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8657,29 +9254,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRemarketingAudience());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_remarketingAudienceId).then(unittest.expectAsync1(((api.RemarketingAudience response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId,
+              arg_remarketingAudienceId)
+          .then(unittest.expectAsync1(((api.RemarketingAudience response) {
         checkRemarketingAudience(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementRemarketingAudienceResourceApi res = new api.AnalyticsApi(mock).management.remarketingAudience;
+      api.ManagementRemarketingAudienceResourceApi res =
+          new api.AnalyticsApi(mock).management.remarketingAudience;
       var arg_request = buildRemarketingAudience();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8692,25 +9293,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/remarketingAudiences/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/remarketingAudiences/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/remarketingAudiences/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8726,33 +9334,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRemarketingAudience());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_remarketingAudienceId).then(unittest.expectAsync1(((api.RemarketingAudience response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId,
+              arg_remarketingAudienceId)
+          .then(unittest.expectAsync1(((api.RemarketingAudience response) {
         checkRemarketingAudience(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementSegmentsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementSegmentsResourceApi res = new api.AnalyticsApi(mock).management.segments;
+      api.ManagementSegmentsResourceApi res =
+          new api.AnalyticsApi(mock).management.segments;
       var arg_max_results = 42;
       var arg_start_index = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -8760,11 +9370,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("management/segments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("management/segments"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -8777,35 +9390,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSegments());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Segments response) {
+      res
+          .list(max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Segments response) {
         checkSegments(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementUnsampledReportsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUnsampledReportsResourceApi res = new api.AnalyticsApi(mock).management.unsampledReports;
+      api.ManagementUnsampledReportsResourceApi res =
+          new api.AnalyticsApi(mock).management.unsampledReports;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -8815,32 +9431,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/unsampledReports/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/unsampledReports/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/unsampledReports/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8856,27 +9481,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_profileId, arg_unsampledReportId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_unsampledReportId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUnsampledReportsResourceApi res = new api.AnalyticsApi(mock).management.unsampledReports;
+      api.ManagementUnsampledReportsResourceApi res =
+          new api.AnalyticsApi(mock).management.unsampledReports;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -8886,32 +9515,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/unsampledReports/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/unsampledReports/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/unsampledReports/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -8927,29 +9565,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUnsampledReport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_profileId, arg_unsampledReportId).then(unittest.expectAsync1(((api.UnsampledReport response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_profileId,
+              arg_unsampledReportId)
+          .then(unittest.expectAsync1(((api.UnsampledReport response) {
         checkUnsampledReport(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUnsampledReportsResourceApi res = new api.AnalyticsApi(mock).management.unsampledReports;
+      api.ManagementUnsampledReportsResourceApi res =
+          new api.AnalyticsApi(mock).management.unsampledReports;
       var arg_request = buildUnsampledReport();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -8962,32 +9604,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/unsampledReports", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/unsampledReports"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/unsampledReports"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -9000,29 +9651,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUnsampledReport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId).then(unittest.expectAsync1(((api.UnsampledReport response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId)
+          .then(unittest.expectAsync1(((api.UnsampledReport response) {
         checkUnsampledReport(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUnsampledReportsResourceApi res = new api.AnalyticsApi(mock).management.unsampledReports;
+      api.ManagementUnsampledReportsResourceApi res =
+          new api.AnalyticsApi(mock).management.unsampledReports;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_profileId = "foo";
@@ -9033,32 +9687,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/profiles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/profiles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/profiles/"));
         pathOffset += 10;
         index = path.indexOf("/unsampledReports", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_profileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/unsampledReports"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/unsampledReports"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -9071,73 +9734,87 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUnsampledReports());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, arg_profileId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.UnsampledReports response) {
+      res
+          .list(arg_accountId, arg_webPropertyId, arg_profileId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.UnsampledReports response) {
         checkUnsampledReports(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementUploadsResourceApi", () {
     unittest.test("method--deleteUploadData", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUploadsResourceApi res = new api.AnalyticsApi(mock).management.uploads;
+      api.ManagementUploadsResourceApi res =
+          new api.AnalyticsApi(mock).management.uploads;
       var arg_request = buildAnalyticsDataimportDeleteUploadDataRequest();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_customDataSourceId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(json);
+        var obj =
+            new api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(json);
         checkAnalyticsDataimportDeleteUploadDataRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDataSources/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/customDataSources/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/customDataSources/"));
         pathOffset += 19;
         index = path.indexOf("/deleteUploadData", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customDataSourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/deleteUploadData"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/deleteUploadData"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -9150,27 +9827,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteUploadData(arg_request, arg_accountId, arg_webPropertyId, arg_customDataSourceId).then(unittest.expectAsync1((_) {}));
+      res
+          .deleteUploadData(arg_request, arg_accountId, arg_webPropertyId,
+              arg_customDataSourceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUploadsResourceApi res = new api.AnalyticsApi(mock).management.uploads;
+      api.ManagementUploadsResourceApi res =
+          new api.AnalyticsApi(mock).management.uploads;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_customDataSourceId = "foo";
@@ -9180,32 +9861,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDataSources/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/customDataSources/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/customDataSources/"));
         pathOffset += 19;
         index = path.indexOf("/uploads/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customDataSourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/uploads/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/uploads/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -9221,29 +9911,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUpload());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_customDataSourceId, arg_uploadId).then(unittest.expectAsync1(((api.Upload response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_customDataSourceId,
+              arg_uploadId)
+          .then(unittest.expectAsync1(((api.Upload response) {
         checkUpload(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementUploadsResourceApi res = new api.AnalyticsApi(mock).management.uploads;
+      api.ManagementUploadsResourceApi res =
+          new api.AnalyticsApi(mock).management.uploads;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_customDataSourceId = "foo";
@@ -9254,32 +9948,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDataSources/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/customDataSources/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/customDataSources/"));
         pathOffset += 19;
         index = path.indexOf("/uploads", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customDataSourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/uploads"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/uploads"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -9292,23 +9995,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUploads());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, arg_customDataSourceId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Uploads response) {
+      res
+          .list(arg_accountId, arg_webPropertyId, arg_customDataSourceId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Uploads response) {
         checkUploads(response);
       })));
     });
@@ -9318,7 +10027,8 @@
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.ManagementUploadsResourceApi res = new api.AnalyticsApi(mock).management.uploads;
+      api.ManagementUploadsResourceApi res =
+          new api.AnalyticsApi(mock).management.uploads;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_customDataSourceId = "foo";
@@ -9327,32 +10037,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/customDataSources/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/customDataSources/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/customDataSources/"));
         pathOffset += 19;
         index = path.indexOf("/uploads", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customDataSourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/uploads"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/uploads"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -9365,33 +10084,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUpload());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.uploadData(arg_accountId, arg_webPropertyId, arg_customDataSourceId).then(unittest.expectAsync1(((api.Upload response) {
+      res
+          .uploadData(arg_accountId, arg_webPropertyId, arg_customDataSourceId)
+          .then(unittest.expectAsync1(((api.Upload response) {
         checkUpload(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementWebPropertyAdWordsLinksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebPropertyAdWordsLinksResourceApi res = new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
+      api.ManagementWebPropertyAdWordsLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_webPropertyAdWordsLinkId = "foo";
@@ -9400,29 +10120,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityAdWordsLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/entityAdWordsLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/entityAdWordsLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9434,27 +10162,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(
+              arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebPropertyAdWordsLinksResourceApi res = new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
+      api.ManagementWebPropertyAdWordsLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_webPropertyAdWordsLinkId = "foo";
@@ -9463,29 +10195,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityAdWordsLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/entityAdWordsLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/entityAdWordsLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9497,29 +10237,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityAdWordsLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId).then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
+      res
+          .get(arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId)
+          .then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
         checkEntityAdWordsLink(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebPropertyAdWordsLinksResourceApi res = new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
+      api.ManagementWebPropertyAdWordsLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
       var arg_request = buildEntityAdWordsLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -9531,25 +10274,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityAdWordsLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/entityAdWordsLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/entityAdWordsLinks"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -9562,29 +10312,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityAdWordsLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
         checkEntityAdWordsLink(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebPropertyAdWordsLinksResourceApi res = new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
+      api.ManagementWebPropertyAdWordsLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -9594,25 +10347,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityAdWordsLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/entityAdWordsLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/entityAdWordsLinks"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -9625,31 +10385,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityAdWordsLinks());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.EntityAdWordsLinks response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.EntityAdWordsLinks response) {
         checkEntityAdWordsLinks(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebPropertyAdWordsLinksResourceApi res = new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
+      api.ManagementWebPropertyAdWordsLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
       var arg_request = buildEntityAdWordsLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -9662,29 +10428,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityAdWordsLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/entityAdWordsLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/entityAdWordsLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9696,29 +10470,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityAdWordsLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId).then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId,
+              arg_webPropertyAdWordsLinkId)
+          .then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
         checkEntityAdWordsLink(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebPropertyAdWordsLinksResourceApi res = new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
+      api.ManagementWebPropertyAdWordsLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webPropertyAdWordsLinks;
       var arg_request = buildEntityAdWordsLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -9731,29 +10509,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityAdWordsLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/entityAdWordsLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/entityAdWordsLinks/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_webPropertyAdWordsLinkId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9765,33 +10551,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityAdWordsLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId).then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId,
+              arg_webPropertyAdWordsLinkId)
+          .then(unittest.expectAsync1(((api.EntityAdWordsLink response) {
         checkEntityAdWordsLink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementWebpropertiesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertiesResourceApi res = new api.AnalyticsApi(mock).management.webproperties;
+      api.ManagementWebpropertiesResourceApi res =
+          new api.AnalyticsApi(mock).management.webproperties;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -9799,18 +10587,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -9826,29 +10619,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebproperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.Webproperty response) {
+      res
+          .get(arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.Webproperty response) {
         checkWebproperty(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertiesResourceApi res = new api.AnalyticsApi(mock).management.webproperties;
+      api.ManagementWebpropertiesResourceApi res =
+          new api.AnalyticsApi(mock).management.webproperties;
       var arg_request = buildWebproperty();
       var arg_accountId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -9859,18 +10655,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/webproperties"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/webproperties"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -9883,29 +10684,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebproperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId).then(unittest.expectAsync1(((api.Webproperty response) {
+      res
+          .insert(arg_request, arg_accountId)
+          .then(unittest.expectAsync1(((api.Webproperty response) {
         checkWebproperty(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertiesResourceApi res = new api.AnalyticsApi(mock).management.webproperties;
+      api.ManagementWebpropertiesResourceApi res =
+          new api.AnalyticsApi(mock).management.webproperties;
       var arg_accountId = "foo";
       var arg_max_results = 42;
       var arg_start_index = 42;
@@ -9914,18 +10718,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/webproperties"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/webproperties"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -9938,31 +10747,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebproperties());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.Webproperties response) {
+      res
+          .list(arg_accountId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.Webproperties response) {
         checkWebproperties(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertiesResourceApi res = new api.AnalyticsApi(mock).management.webproperties;
+      api.ManagementWebpropertiesResourceApi res =
+          new api.AnalyticsApi(mock).management.webproperties;
       var arg_request = buildWebproperty();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -9974,18 +10789,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -10001,29 +10821,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebproperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.Webproperty response) {
+      res
+          .patch(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.Webproperty response) {
         checkWebproperty(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertiesResourceApi res = new api.AnalyticsApi(mock).management.webproperties;
+      api.ManagementWebpropertiesResourceApi res =
+          new api.AnalyticsApi(mock).management.webproperties;
       var arg_request = buildWebproperty();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -10035,18 +10858,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -10062,33 +10890,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebproperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.Webproperty response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.Webproperty response) {
         checkWebproperty(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagementWebpropertyUserLinksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertyUserLinksResourceApi res = new api.AnalyticsApi(mock).management.webpropertyUserLinks;
+      api.ManagementWebpropertyUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webpropertyUserLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_linkId = "foo";
@@ -10097,25 +10926,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityUserLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/entityUserLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/entityUserLinks/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -10131,27 +10967,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_accountId, arg_webPropertyId, arg_linkId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_accountId, arg_webPropertyId, arg_linkId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertyUserLinksResourceApi res = new api.AnalyticsApi(mock).management.webpropertyUserLinks;
+      api.ManagementWebpropertyUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webpropertyUserLinks;
       var arg_request = buildEntityUserLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -10163,25 +11002,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityUserLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/entityUserLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/entityUserLinks"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -10194,29 +11040,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_accountId, arg_webPropertyId).then(unittest.expectAsync1(((api.EntityUserLink response) {
+      res
+          .insert(arg_request, arg_accountId, arg_webPropertyId)
+          .then(unittest.expectAsync1(((api.EntityUserLink response) {
         checkEntityUserLink(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertyUserLinksResourceApi res = new api.AnalyticsApi(mock).management.webpropertyUserLinks;
+      api.ManagementWebpropertyUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webpropertyUserLinks;
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
       var arg_max_results = 42;
@@ -10226,25 +11075,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityUserLinks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/entityUserLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/entityUserLinks"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -10257,31 +11113,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLinks());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_accountId, arg_webPropertyId, max_results: arg_max_results, start_index: arg_start_index).then(unittest.expectAsync1(((api.EntityUserLinks response) {
+      res
+          .list(arg_accountId, arg_webPropertyId,
+              max_results: arg_max_results, start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.EntityUserLinks response) {
         checkEntityUserLinks(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagementWebpropertyUserLinksResourceApi res = new api.AnalyticsApi(mock).management.webpropertyUserLinks;
+      api.ManagementWebpropertyUserLinksResourceApi res =
+          new api.AnalyticsApi(mock).management.webpropertyUserLinks;
       var arg_request = buildEntityUserLink();
       var arg_accountId = "foo";
       var arg_webPropertyId = "foo";
@@ -10294,25 +11156,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/webproperties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/webproperties/"));
         pathOffset += 15;
         index = path.indexOf("/entityUserLinks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_webPropertyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/entityUserLinks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/entityUserLinks/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -10328,51 +11197,57 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntityUserLink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_accountId, arg_webPropertyId, arg_linkId).then(unittest.expectAsync1(((api.EntityUserLink response) {
+      res
+          .update(arg_request, arg_accountId, arg_webPropertyId, arg_linkId)
+          .then(unittest.expectAsync1(((api.EntityUserLink response) {
         checkEntityUserLink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MetadataColumnsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.MetadataColumnsResourceApi res = new api.AnalyticsApi(mock).metadata.columns;
+      api.MetadataColumnsResourceApi res =
+          new api.AnalyticsApi(mock).metadata.columns;
       var arg_reportType = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("metadata/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("metadata/"));
         pathOffset += 9;
         index = path.indexOf("/columns", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_reportType"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/columns"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/columns"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -10385,31 +11260,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumns());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_reportType).then(unittest.expectAsync1(((api.Columns response) {
+      res
+          .list(arg_reportType)
+          .then(unittest.expectAsync1(((api.Columns response) {
         checkColumns(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProvisioningResourceApi", () {
     unittest.test("method--createAccountTicket", () {
-
       var mock = new HttpServerMock();
       api.ProvisioningResourceApi res = new api.AnalyticsApi(mock).provisioning;
       var arg_request = buildAccountTicket();
@@ -10421,11 +11296,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("analytics/v3/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("provisioning/createAccountTicket"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("provisioning/createAccountTicket"));
         pathOffset += 32;
 
         var query = (req.url).query;
@@ -10438,27 +11316,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAccountTicket());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.createAccountTicket(arg_request).then(unittest.expectAsync1(((api.AccountTicket response) {
+      res
+          .createAccountTicket(arg_request)
+          .then(unittest.expectAsync1(((api.AccountTicket response) {
         checkAccountTicket(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/analyticsreporting/v4_test.dart b/generated/googleapis/test/analyticsreporting/v4_test.dart
index c7db1dc..8eeeaeb 100644
--- a/generated/googleapis/test/analyticsreporting/v4_test.dart
+++ b/generated/googleapis/test/analyticsreporting/v4_test.dart
@@ -1,12 +1,10 @@
 library googleapis.analyticsreporting.v4.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/analyticsreporting/v4.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -74,14 +73,14 @@
   buildCounterCohort--;
 }
 
-buildUnnamed214() {
+buildUnnamed209() {
   var o = new core.List<api.Cohort>();
   o.add(buildCohort());
   o.add(buildCohort());
   return o;
 }
 
-checkUnnamed214(core.List<api.Cohort> o) {
+checkUnnamed209(core.List<api.Cohort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCohort(o[0]);
   checkCohort(o[1]);
@@ -92,7 +91,7 @@
   var o = new api.CohortGroup();
   buildCounterCohortGroup++;
   if (buildCounterCohortGroup < 3) {
-    o.cohorts = buildUnnamed214();
+    o.cohorts = buildUnnamed209();
     o.lifetimeValue = true;
   }
   buildCounterCohortGroup--;
@@ -102,20 +101,20 @@
 checkCohortGroup(api.CohortGroup o) {
   buildCounterCohortGroup++;
   if (buildCounterCohortGroup < 3) {
-    checkUnnamed214(o.cohorts);
+    checkUnnamed209(o.cohorts);
     unittest.expect(o.lifetimeValue, unittest.isTrue);
   }
   buildCounterCohortGroup--;
 }
 
-buildUnnamed215() {
+buildUnnamed210() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed215(core.List<core.String> o) {
+checkUnnamed210(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -126,7 +125,7 @@
   var o = new api.ColumnHeader();
   buildCounterColumnHeader++;
   if (buildCounterColumnHeader < 3) {
-    o.dimensions = buildUnnamed215();
+    o.dimensions = buildUnnamed210();
     o.metricHeader = buildMetricHeader();
   }
   buildCounterColumnHeader--;
@@ -136,7 +135,7 @@
 checkColumnHeader(api.ColumnHeader o) {
   buildCounterColumnHeader++;
   if (buildCounterColumnHeader < 3) {
-    checkUnnamed215(o.dimensions);
+    checkUnnamed210(o.dimensions);
     checkMetricHeader(o.metricHeader);
   }
   buildCounterColumnHeader--;
@@ -163,27 +162,27 @@
   buildCounterDateRange--;
 }
 
-buildUnnamed216() {
+buildUnnamed211() {
   var o = new core.List<api.PivotValueRegion>();
   o.add(buildPivotValueRegion());
   o.add(buildPivotValueRegion());
   return o;
 }
 
-checkUnnamed216(core.List<api.PivotValueRegion> o) {
+checkUnnamed211(core.List<api.PivotValueRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotValueRegion(o[0]);
   checkPivotValueRegion(o[1]);
 }
 
-buildUnnamed217() {
+buildUnnamed212() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed217(core.List<core.String> o) {
+checkUnnamed212(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -194,8 +193,8 @@
   var o = new api.DateRangeValues();
   buildCounterDateRangeValues++;
   if (buildCounterDateRangeValues < 3) {
-    o.pivotValueRegions = buildUnnamed216();
-    o.values = buildUnnamed217();
+    o.pivotValueRegions = buildUnnamed211();
+    o.values = buildUnnamed212();
   }
   buildCounterDateRangeValues--;
   return o;
@@ -204,20 +203,20 @@
 checkDateRangeValues(api.DateRangeValues o) {
   buildCounterDateRangeValues++;
   if (buildCounterDateRangeValues < 3) {
-    checkUnnamed216(o.pivotValueRegions);
-    checkUnnamed217(o.values);
+    checkUnnamed211(o.pivotValueRegions);
+    checkUnnamed212(o.values);
   }
   buildCounterDateRangeValues--;
 }
 
-buildUnnamed218() {
+buildUnnamed213() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed218(core.List<core.String> o) {
+checkUnnamed213(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -228,7 +227,7 @@
   var o = new api.Dimension();
   buildCounterDimension++;
   if (buildCounterDimension < 3) {
-    o.histogramBuckets = buildUnnamed218();
+    o.histogramBuckets = buildUnnamed213();
     o.name = "foo";
   }
   buildCounterDimension--;
@@ -238,20 +237,20 @@
 checkDimension(api.Dimension o) {
   buildCounterDimension++;
   if (buildCounterDimension < 3) {
-    checkUnnamed218(o.histogramBuckets);
+    checkUnnamed213(o.histogramBuckets);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterDimension--;
 }
 
-buildUnnamed219() {
+buildUnnamed214() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed219(core.List<core.String> o) {
+checkUnnamed214(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -264,7 +263,7 @@
   if (buildCounterDimensionFilter < 3) {
     o.caseSensitive = true;
     o.dimensionName = "foo";
-    o.expressions = buildUnnamed219();
+    o.expressions = buildUnnamed214();
     o.not = true;
     o.operator = "foo";
   }
@@ -277,21 +276,21 @@
   if (buildCounterDimensionFilter < 3) {
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.dimensionName, unittest.equals('foo'));
-    checkUnnamed219(o.expressions);
+    checkUnnamed214(o.expressions);
     unittest.expect(o.not, unittest.isTrue);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterDimensionFilter--;
 }
 
-buildUnnamed220() {
+buildUnnamed215() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed220(core.List<api.DimensionFilter> o) {
+checkUnnamed215(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -302,7 +301,7 @@
   var o = new api.DimensionFilterClause();
   buildCounterDimensionFilterClause++;
   if (buildCounterDimensionFilterClause < 3) {
-    o.filters = buildUnnamed220();
+    o.filters = buildUnnamed215();
     o.operator = "foo";
   }
   buildCounterDimensionFilterClause--;
@@ -312,7 +311,7 @@
 checkDimensionFilterClause(api.DimensionFilterClause o) {
   buildCounterDimensionFilterClause++;
   if (buildCounterDimensionFilterClause < 3) {
-    checkUnnamed220(o.filters);
+    checkUnnamed215(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterDimensionFilterClause--;
@@ -341,14 +340,14 @@
   buildCounterDynamicSegment--;
 }
 
-buildUnnamed221() {
+buildUnnamed216() {
   var o = new core.List<api.ReportRequest>();
   o.add(buildReportRequest());
   o.add(buildReportRequest());
   return o;
 }
 
-checkUnnamed221(core.List<api.ReportRequest> o) {
+checkUnnamed216(core.List<api.ReportRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequest(o[0]);
   checkReportRequest(o[1]);
@@ -359,7 +358,7 @@
   var o = new api.GetReportsRequest();
   buildCounterGetReportsRequest++;
   if (buildCounterGetReportsRequest < 3) {
-    o.reportRequests = buildUnnamed221();
+    o.reportRequests = buildUnnamed216();
   }
   buildCounterGetReportsRequest--;
   return o;
@@ -368,19 +367,19 @@
 checkGetReportsRequest(api.GetReportsRequest o) {
   buildCounterGetReportsRequest++;
   if (buildCounterGetReportsRequest < 3) {
-    checkUnnamed221(o.reportRequests);
+    checkUnnamed216(o.reportRequests);
   }
   buildCounterGetReportsRequest--;
 }
 
-buildUnnamed222() {
+buildUnnamed217() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed222(core.List<api.Report> o) {
+checkUnnamed217(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -391,7 +390,7 @@
   var o = new api.GetReportsResponse();
   buildCounterGetReportsResponse++;
   if (buildCounterGetReportsResponse < 3) {
-    o.reports = buildUnnamed222();
+    o.reports = buildUnnamed217();
   }
   buildCounterGetReportsResponse--;
   return o;
@@ -400,7 +399,7 @@
 checkGetReportsResponse(api.GetReportsResponse o) {
   buildCounterGetReportsResponse++;
   if (buildCounterGetReportsResponse < 3) {
-    checkUnnamed222(o.reports);
+    checkUnnamed217(o.reports);
   }
   buildCounterGetReportsResponse--;
 }
@@ -453,14 +452,14 @@
   buildCounterMetricFilter--;
 }
 
-buildUnnamed223() {
+buildUnnamed218() {
   var o = new core.List<api.MetricFilter>();
   o.add(buildMetricFilter());
   o.add(buildMetricFilter());
   return o;
 }
 
-checkUnnamed223(core.List<api.MetricFilter> o) {
+checkUnnamed218(core.List<api.MetricFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricFilter(o[0]);
   checkMetricFilter(o[1]);
@@ -471,7 +470,7 @@
   var o = new api.MetricFilterClause();
   buildCounterMetricFilterClause++;
   if (buildCounterMetricFilterClause < 3) {
-    o.filters = buildUnnamed223();
+    o.filters = buildUnnamed218();
     o.operator = "foo";
   }
   buildCounterMetricFilterClause--;
@@ -481,33 +480,33 @@
 checkMetricFilterClause(api.MetricFilterClause o) {
   buildCounterMetricFilterClause++;
   if (buildCounterMetricFilterClause < 3) {
-    checkUnnamed223(o.filters);
+    checkUnnamed218(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterMetricFilterClause--;
 }
 
-buildUnnamed224() {
+buildUnnamed219() {
   var o = new core.List<api.MetricHeaderEntry>();
   o.add(buildMetricHeaderEntry());
   o.add(buildMetricHeaderEntry());
   return o;
 }
 
-checkUnnamed224(core.List<api.MetricHeaderEntry> o) {
+checkUnnamed219(core.List<api.MetricHeaderEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricHeaderEntry(o[0]);
   checkMetricHeaderEntry(o[1]);
 }
 
-buildUnnamed225() {
+buildUnnamed220() {
   var o = new core.List<api.PivotHeader>();
   o.add(buildPivotHeader());
   o.add(buildPivotHeader());
   return o;
 }
 
-checkUnnamed225(core.List<api.PivotHeader> o) {
+checkUnnamed220(core.List<api.PivotHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotHeader(o[0]);
   checkPivotHeader(o[1]);
@@ -518,8 +517,8 @@
   var o = new api.MetricHeader();
   buildCounterMetricHeader++;
   if (buildCounterMetricHeader < 3) {
-    o.metricHeaderEntries = buildUnnamed224();
-    o.pivotHeaders = buildUnnamed225();
+    o.metricHeaderEntries = buildUnnamed219();
+    o.pivotHeaders = buildUnnamed220();
   }
   buildCounterMetricHeader--;
   return o;
@@ -528,8 +527,8 @@
 checkMetricHeader(api.MetricHeader o) {
   buildCounterMetricHeader++;
   if (buildCounterMetricHeader < 3) {
-    checkUnnamed224(o.metricHeaderEntries);
-    checkUnnamed225(o.pivotHeaders);
+    checkUnnamed219(o.metricHeaderEntries);
+    checkUnnamed220(o.pivotHeaders);
   }
   buildCounterMetricHeader--;
 }
@@ -555,14 +554,14 @@
   buildCounterMetricHeaderEntry--;
 }
 
-buildUnnamed226() {
+buildUnnamed221() {
   var o = new core.List<api.SegmentFilterClause>();
   o.add(buildSegmentFilterClause());
   o.add(buildSegmentFilterClause());
   return o;
 }
 
-checkUnnamed226(core.List<api.SegmentFilterClause> o) {
+checkUnnamed221(core.List<api.SegmentFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentFilterClause(o[0]);
   checkSegmentFilterClause(o[1]);
@@ -573,7 +572,7 @@
   var o = new api.OrFiltersForSegment();
   buildCounterOrFiltersForSegment++;
   if (buildCounterOrFiltersForSegment < 3) {
-    o.segmentFilterClauses = buildUnnamed226();
+    o.segmentFilterClauses = buildUnnamed221();
   }
   buildCounterOrFiltersForSegment--;
   return o;
@@ -582,7 +581,7 @@
 checkOrFiltersForSegment(api.OrFiltersForSegment o) {
   buildCounterOrFiltersForSegment++;
   if (buildCounterOrFiltersForSegment < 3) {
-    checkUnnamed226(o.segmentFilterClauses);
+    checkUnnamed221(o.segmentFilterClauses);
   }
   buildCounterOrFiltersForSegment--;
 }
@@ -610,40 +609,40 @@
   buildCounterOrderBy--;
 }
 
-buildUnnamed227() {
+buildUnnamed222() {
   var o = new core.List<api.DimensionFilterClause>();
   o.add(buildDimensionFilterClause());
   o.add(buildDimensionFilterClause());
   return o;
 }
 
-checkUnnamed227(core.List<api.DimensionFilterClause> o) {
+checkUnnamed222(core.List<api.DimensionFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilterClause(o[0]);
   checkDimensionFilterClause(o[1]);
 }
 
-buildUnnamed228() {
+buildUnnamed223() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed228(core.List<api.Dimension> o) {
+checkUnnamed223(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed229() {
+buildUnnamed224() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed229(core.List<api.Metric> o) {
+checkUnnamed224(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -654,10 +653,10 @@
   var o = new api.Pivot();
   buildCounterPivot++;
   if (buildCounterPivot < 3) {
-    o.dimensionFilterClauses = buildUnnamed227();
-    o.dimensions = buildUnnamed228();
+    o.dimensionFilterClauses = buildUnnamed222();
+    o.dimensions = buildUnnamed223();
     o.maxGroupCount = 42;
-    o.metrics = buildUnnamed229();
+    o.metrics = buildUnnamed224();
     o.startGroup = 42;
   }
   buildCounterPivot--;
@@ -667,23 +666,23 @@
 checkPivot(api.Pivot o) {
   buildCounterPivot++;
   if (buildCounterPivot < 3) {
-    checkUnnamed227(o.dimensionFilterClauses);
-    checkUnnamed228(o.dimensions);
+    checkUnnamed222(o.dimensionFilterClauses);
+    checkUnnamed223(o.dimensions);
     unittest.expect(o.maxGroupCount, unittest.equals(42));
-    checkUnnamed229(o.metrics);
+    checkUnnamed224(o.metrics);
     unittest.expect(o.startGroup, unittest.equals(42));
   }
   buildCounterPivot--;
 }
 
-buildUnnamed230() {
+buildUnnamed225() {
   var o = new core.List<api.PivotHeaderEntry>();
   o.add(buildPivotHeaderEntry());
   o.add(buildPivotHeaderEntry());
   return o;
 }
 
-checkUnnamed230(core.List<api.PivotHeaderEntry> o) {
+checkUnnamed225(core.List<api.PivotHeaderEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivotHeaderEntry(o[0]);
   checkPivotHeaderEntry(o[1]);
@@ -694,7 +693,7 @@
   var o = new api.PivotHeader();
   buildCounterPivotHeader++;
   if (buildCounterPivotHeader < 3) {
-    o.pivotHeaderEntries = buildUnnamed230();
+    o.pivotHeaderEntries = buildUnnamed225();
     o.totalPivotGroupsCount = 42;
   }
   buildCounterPivotHeader--;
@@ -704,33 +703,33 @@
 checkPivotHeader(api.PivotHeader o) {
   buildCounterPivotHeader++;
   if (buildCounterPivotHeader < 3) {
-    checkUnnamed230(o.pivotHeaderEntries);
+    checkUnnamed225(o.pivotHeaderEntries);
     unittest.expect(o.totalPivotGroupsCount, unittest.equals(42));
   }
   buildCounterPivotHeader--;
 }
 
-buildUnnamed231() {
+buildUnnamed226() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed231(core.List<core.String> o) {
+checkUnnamed226(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed232() {
+buildUnnamed227() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed232(core.List<core.String> o) {
+checkUnnamed227(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -741,8 +740,8 @@
   var o = new api.PivotHeaderEntry();
   buildCounterPivotHeaderEntry++;
   if (buildCounterPivotHeaderEntry < 3) {
-    o.dimensionNames = buildUnnamed231();
-    o.dimensionValues = buildUnnamed232();
+    o.dimensionNames = buildUnnamed226();
+    o.dimensionValues = buildUnnamed227();
     o.metric = buildMetricHeaderEntry();
   }
   buildCounterPivotHeaderEntry--;
@@ -752,21 +751,21 @@
 checkPivotHeaderEntry(api.PivotHeaderEntry o) {
   buildCounterPivotHeaderEntry++;
   if (buildCounterPivotHeaderEntry < 3) {
-    checkUnnamed231(o.dimensionNames);
-    checkUnnamed232(o.dimensionValues);
+    checkUnnamed226(o.dimensionNames);
+    checkUnnamed227(o.dimensionValues);
     checkMetricHeaderEntry(o.metric);
   }
   buildCounterPivotHeaderEntry--;
 }
 
-buildUnnamed233() {
+buildUnnamed228() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed233(core.List<core.String> o) {
+checkUnnamed228(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -777,7 +776,7 @@
   var o = new api.PivotValueRegion();
   buildCounterPivotValueRegion++;
   if (buildCounterPivotValueRegion < 3) {
-    o.values = buildUnnamed233();
+    o.values = buildUnnamed228();
   }
   buildCounterPivotValueRegion--;
   return o;
@@ -786,7 +785,7 @@
 checkPivotValueRegion(api.PivotValueRegion o) {
   buildCounterPivotValueRegion++;
   if (buildCounterPivotValueRegion < 3) {
-    checkUnnamed233(o.values);
+    checkUnnamed228(o.values);
   }
   buildCounterPivotValueRegion--;
 }
@@ -814,6 +813,71 @@
   buildCounterReport--;
 }
 
+buildUnnamed229() {
+  var o = new core.List<api.DateRangeValues>();
+  o.add(buildDateRangeValues());
+  o.add(buildDateRangeValues());
+  return o;
+}
+
+checkUnnamed229(core.List<api.DateRangeValues> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDateRangeValues(o[0]);
+  checkDateRangeValues(o[1]);
+}
+
+buildUnnamed230() {
+  var o = new core.List<api.DateRangeValues>();
+  o.add(buildDateRangeValues());
+  o.add(buildDateRangeValues());
+  return o;
+}
+
+checkUnnamed230(core.List<api.DateRangeValues> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDateRangeValues(o[0]);
+  checkDateRangeValues(o[1]);
+}
+
+buildUnnamed231() {
+  var o = new core.List<api.ReportRow>();
+  o.add(buildReportRow());
+  o.add(buildReportRow());
+  return o;
+}
+
+checkUnnamed231(core.List<api.ReportRow> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReportRow(o[0]);
+  checkReportRow(o[1]);
+}
+
+buildUnnamed232() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed232(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed233() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed233(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed234() {
   var o = new core.List<api.DateRangeValues>();
   o.add(buildDateRangeValues());
@@ -827,71 +891,6 @@
   checkDateRangeValues(o[1]);
 }
 
-buildUnnamed235() {
-  var o = new core.List<api.DateRangeValues>();
-  o.add(buildDateRangeValues());
-  o.add(buildDateRangeValues());
-  return o;
-}
-
-checkUnnamed235(core.List<api.DateRangeValues> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
-}
-
-buildUnnamed236() {
-  var o = new core.List<api.ReportRow>();
-  o.add(buildReportRow());
-  o.add(buildReportRow());
-  return o;
-}
-
-checkUnnamed236(core.List<api.ReportRow> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkReportRow(o[0]);
-  checkReportRow(o[1]);
-}
-
-buildUnnamed237() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed237(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed238() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed238(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed239() {
-  var o = new core.List<api.DateRangeValues>();
-  o.add(buildDateRangeValues());
-  o.add(buildDateRangeValues());
-  return o;
-}
-
-checkUnnamed239(core.List<api.DateRangeValues> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
-}
-
 core.int buildCounterReportData = 0;
 buildReportData() {
   var o = new api.ReportData();
@@ -899,13 +898,13 @@
   if (buildCounterReportData < 3) {
     o.dataLastRefreshed = "foo";
     o.isDataGolden = true;
-    o.maximums = buildUnnamed234();
-    o.minimums = buildUnnamed235();
+    o.maximums = buildUnnamed229();
+    o.minimums = buildUnnamed230();
     o.rowCount = 42;
-    o.rows = buildUnnamed236();
-    o.samplesReadCounts = buildUnnamed237();
-    o.samplingSpaceSizes = buildUnnamed238();
-    o.totals = buildUnnamed239();
+    o.rows = buildUnnamed231();
+    o.samplesReadCounts = buildUnnamed232();
+    o.samplingSpaceSizes = buildUnnamed233();
+    o.totals = buildUnnamed234();
   }
   buildCounterReportData--;
   return o;
@@ -916,116 +915,116 @@
   if (buildCounterReportData < 3) {
     unittest.expect(o.dataLastRefreshed, unittest.equals('foo'));
     unittest.expect(o.isDataGolden, unittest.isTrue);
-    checkUnnamed234(o.maximums);
-    checkUnnamed235(o.minimums);
+    checkUnnamed229(o.maximums);
+    checkUnnamed230(o.minimums);
     unittest.expect(o.rowCount, unittest.equals(42));
-    checkUnnamed236(o.rows);
-    checkUnnamed237(o.samplesReadCounts);
-    checkUnnamed238(o.samplingSpaceSizes);
-    checkUnnamed239(o.totals);
+    checkUnnamed231(o.rows);
+    checkUnnamed232(o.samplesReadCounts);
+    checkUnnamed233(o.samplingSpaceSizes);
+    checkUnnamed234(o.totals);
   }
   buildCounterReportData--;
 }
 
-buildUnnamed240() {
+buildUnnamed235() {
   var o = new core.List<api.DateRange>();
   o.add(buildDateRange());
   o.add(buildDateRange());
   return o;
 }
 
-checkUnnamed240(core.List<api.DateRange> o) {
+checkUnnamed235(core.List<api.DateRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDateRange(o[0]);
   checkDateRange(o[1]);
 }
 
-buildUnnamed241() {
+buildUnnamed236() {
   var o = new core.List<api.DimensionFilterClause>();
   o.add(buildDimensionFilterClause());
   o.add(buildDimensionFilterClause());
   return o;
 }
 
-checkUnnamed241(core.List<api.DimensionFilterClause> o) {
+checkUnnamed236(core.List<api.DimensionFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilterClause(o[0]);
   checkDimensionFilterClause(o[1]);
 }
 
-buildUnnamed242() {
+buildUnnamed237() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed242(core.List<api.Dimension> o) {
+checkUnnamed237(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed243() {
+buildUnnamed238() {
   var o = new core.List<api.MetricFilterClause>();
   o.add(buildMetricFilterClause());
   o.add(buildMetricFilterClause());
   return o;
 }
 
-checkUnnamed243(core.List<api.MetricFilterClause> o) {
+checkUnnamed238(core.List<api.MetricFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricFilterClause(o[0]);
   checkMetricFilterClause(o[1]);
 }
 
-buildUnnamed244() {
+buildUnnamed239() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed244(core.List<api.Metric> o) {
+checkUnnamed239(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed245() {
+buildUnnamed240() {
   var o = new core.List<api.OrderBy>();
   o.add(buildOrderBy());
   o.add(buildOrderBy());
   return o;
 }
 
-checkUnnamed245(core.List<api.OrderBy> o) {
+checkUnnamed240(core.List<api.OrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrderBy(o[0]);
   checkOrderBy(o[1]);
 }
 
-buildUnnamed246() {
+buildUnnamed241() {
   var o = new core.List<api.Pivot>();
   o.add(buildPivot());
   o.add(buildPivot());
   return o;
 }
 
-checkUnnamed246(core.List<api.Pivot> o) {
+checkUnnamed241(core.List<api.Pivot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPivot(o[0]);
   checkPivot(o[1]);
 }
 
-buildUnnamed247() {
+buildUnnamed242() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed247(core.List<api.Segment> o) {
+checkUnnamed242(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -1037,21 +1036,21 @@
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
     o.cohortGroup = buildCohortGroup();
-    o.dateRanges = buildUnnamed240();
-    o.dimensionFilterClauses = buildUnnamed241();
-    o.dimensions = buildUnnamed242();
+    o.dateRanges = buildUnnamed235();
+    o.dimensionFilterClauses = buildUnnamed236();
+    o.dimensions = buildUnnamed237();
     o.filtersExpression = "foo";
     o.hideTotals = true;
     o.hideValueRanges = true;
     o.includeEmptyRows = true;
-    o.metricFilterClauses = buildUnnamed243();
-    o.metrics = buildUnnamed244();
-    o.orderBys = buildUnnamed245();
+    o.metricFilterClauses = buildUnnamed238();
+    o.metrics = buildUnnamed239();
+    o.orderBys = buildUnnamed240();
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.pivots = buildUnnamed246();
+    o.pivots = buildUnnamed241();
     o.samplingLevel = "foo";
-    o.segments = buildUnnamed247();
+    o.segments = buildUnnamed242();
     o.viewId = "foo";
   }
   buildCounterReportRequest--;
@@ -1062,47 +1061,47 @@
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
     checkCohortGroup(o.cohortGroup);
-    checkUnnamed240(o.dateRanges);
-    checkUnnamed241(o.dimensionFilterClauses);
-    checkUnnamed242(o.dimensions);
+    checkUnnamed235(o.dateRanges);
+    checkUnnamed236(o.dimensionFilterClauses);
+    checkUnnamed237(o.dimensions);
     unittest.expect(o.filtersExpression, unittest.equals('foo'));
     unittest.expect(o.hideTotals, unittest.isTrue);
     unittest.expect(o.hideValueRanges, unittest.isTrue);
     unittest.expect(o.includeEmptyRows, unittest.isTrue);
-    checkUnnamed243(o.metricFilterClauses);
-    checkUnnamed244(o.metrics);
-    checkUnnamed245(o.orderBys);
+    checkUnnamed238(o.metricFilterClauses);
+    checkUnnamed239(o.metrics);
+    checkUnnamed240(o.orderBys);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed246(o.pivots);
+    checkUnnamed241(o.pivots);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
-    checkUnnamed247(o.segments);
+    checkUnnamed242(o.segments);
     unittest.expect(o.viewId, unittest.equals('foo'));
   }
   buildCounterReportRequest--;
 }
 
-buildUnnamed248() {
+buildUnnamed243() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed248(core.List<core.String> o) {
+checkUnnamed243(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed249() {
+buildUnnamed244() {
   var o = new core.List<api.DateRangeValues>();
   o.add(buildDateRangeValues());
   o.add(buildDateRangeValues());
   return o;
 }
 
-checkUnnamed249(core.List<api.DateRangeValues> o) {
+checkUnnamed244(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDateRangeValues(o[0]);
   checkDateRangeValues(o[1]);
@@ -1113,8 +1112,8 @@
   var o = new api.ReportRow();
   buildCounterReportRow++;
   if (buildCounterReportRow < 3) {
-    o.dimensions = buildUnnamed248();
-    o.metrics = buildUnnamed249();
+    o.dimensions = buildUnnamed243();
+    o.metrics = buildUnnamed244();
   }
   buildCounterReportRow--;
   return o;
@@ -1123,8 +1122,8 @@
 checkReportRow(api.ReportRow o) {
   buildCounterReportRow++;
   if (buildCounterReportRow < 3) {
-    checkUnnamed248(o.dimensions);
-    checkUnnamed249(o.metrics);
+    checkUnnamed243(o.dimensions);
+    checkUnnamed244(o.metrics);
   }
   buildCounterReportRow--;
 }
@@ -1150,14 +1149,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed250() {
+buildUnnamed245() {
   var o = new core.List<api.SegmentFilter>();
   o.add(buildSegmentFilter());
   o.add(buildSegmentFilter());
   return o;
 }
 
-checkUnnamed250(core.List<api.SegmentFilter> o) {
+checkUnnamed245(core.List<api.SegmentFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentFilter(o[0]);
   checkSegmentFilter(o[1]);
@@ -1168,7 +1167,7 @@
   var o = new api.SegmentDefinition();
   buildCounterSegmentDefinition++;
   if (buildCounterSegmentDefinition < 3) {
-    o.segmentFilters = buildUnnamed250();
+    o.segmentFilters = buildUnnamed245();
   }
   buildCounterSegmentDefinition--;
   return o;
@@ -1177,19 +1176,19 @@
 checkSegmentDefinition(api.SegmentDefinition o) {
   buildCounterSegmentDefinition++;
   if (buildCounterSegmentDefinition < 3) {
-    checkUnnamed250(o.segmentFilters);
+    checkUnnamed245(o.segmentFilters);
   }
   buildCounterSegmentDefinition--;
 }
 
-buildUnnamed251() {
+buildUnnamed246() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed251(core.List<core.String> o) {
+checkUnnamed246(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1202,7 +1201,7 @@
   if (buildCounterSegmentDimensionFilter < 3) {
     o.caseSensitive = true;
     o.dimensionName = "foo";
-    o.expressions = buildUnnamed251();
+    o.expressions = buildUnnamed246();
     o.maxComparisonValue = "foo";
     o.minComparisonValue = "foo";
     o.operator = "foo";
@@ -1216,7 +1215,7 @@
   if (buildCounterSegmentDimensionFilter < 3) {
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.dimensionName, unittest.equals('foo'));
-    checkUnnamed251(o.expressions);
+    checkUnnamed246(o.expressions);
     unittest.expect(o.maxComparisonValue, unittest.equals('foo'));
     unittest.expect(o.minComparisonValue, unittest.equals('foo'));
     unittest.expect(o.operator, unittest.equals('foo'));
@@ -1297,14 +1296,14 @@
   buildCounterSegmentMetricFilter--;
 }
 
-buildUnnamed252() {
+buildUnnamed247() {
   var o = new core.List<api.OrFiltersForSegment>();
   o.add(buildOrFiltersForSegment());
   o.add(buildOrFiltersForSegment());
   return o;
 }
 
-checkUnnamed252(core.List<api.OrFiltersForSegment> o) {
+checkUnnamed247(core.List<api.OrFiltersForSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrFiltersForSegment(o[0]);
   checkOrFiltersForSegment(o[1]);
@@ -1316,7 +1315,7 @@
   buildCounterSegmentSequenceStep++;
   if (buildCounterSegmentSequenceStep < 3) {
     o.matchType = "foo";
-    o.orFiltersForSegment = buildUnnamed252();
+    o.orFiltersForSegment = buildUnnamed247();
   }
   buildCounterSegmentSequenceStep--;
   return o;
@@ -1326,19 +1325,19 @@
   buildCounterSegmentSequenceStep++;
   if (buildCounterSegmentSequenceStep < 3) {
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed252(o.orFiltersForSegment);
+    checkUnnamed247(o.orFiltersForSegment);
   }
   buildCounterSegmentSequenceStep--;
 }
 
-buildUnnamed253() {
+buildUnnamed248() {
   var o = new core.List<api.SegmentSequenceStep>();
   o.add(buildSegmentSequenceStep());
   o.add(buildSegmentSequenceStep());
   return o;
 }
 
-checkUnnamed253(core.List<api.SegmentSequenceStep> o) {
+checkUnnamed248(core.List<api.SegmentSequenceStep> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentSequenceStep(o[0]);
   checkSegmentSequenceStep(o[1]);
@@ -1350,7 +1349,7 @@
   buildCounterSequenceSegment++;
   if (buildCounterSequenceSegment < 3) {
     o.firstStepShouldMatchFirstHit = true;
-    o.segmentSequenceSteps = buildUnnamed253();
+    o.segmentSequenceSteps = buildUnnamed248();
   }
   buildCounterSequenceSegment--;
   return o;
@@ -1360,19 +1359,19 @@
   buildCounterSequenceSegment++;
   if (buildCounterSequenceSegment < 3) {
     unittest.expect(o.firstStepShouldMatchFirstHit, unittest.isTrue);
-    checkUnnamed253(o.segmentSequenceSteps);
+    checkUnnamed248(o.segmentSequenceSteps);
   }
   buildCounterSequenceSegment--;
 }
 
-buildUnnamed254() {
+buildUnnamed249() {
   var o = new core.List<api.OrFiltersForSegment>();
   o.add(buildOrFiltersForSegment());
   o.add(buildOrFiltersForSegment());
   return o;
 }
 
-checkUnnamed254(core.List<api.OrFiltersForSegment> o) {
+checkUnnamed249(core.List<api.OrFiltersForSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrFiltersForSegment(o[0]);
   checkOrFiltersForSegment(o[1]);
@@ -1383,7 +1382,7 @@
   var o = new api.SimpleSegment();
   buildCounterSimpleSegment++;
   if (buildCounterSimpleSegment < 3) {
-    o.orFiltersForSegment = buildUnnamed254();
+    o.orFiltersForSegment = buildUnnamed249();
   }
   buildCounterSimpleSegment--;
   return o;
@@ -1392,12 +1391,11 @@
 checkSimpleSegment(api.SimpleSegment o) {
   buildCounterSimpleSegment++;
   if (buildCounterSimpleSegment < 3) {
-    checkUnnamed254(o.orFiltersForSegment);
+    checkUnnamed249(o.orFiltersForSegment);
   }
   buildCounterSimpleSegment--;
 }
 
-
 main() {
   unittest.group("obj-schema-Cohort", () {
     unittest.test("to-json--from-json", () {
@@ -1407,7 +1405,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CohortGroup", () {
     unittest.test("to-json--from-json", () {
       var o = buildCohortGroup();
@@ -1416,7 +1413,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColumnHeader", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumnHeader();
@@ -1425,7 +1421,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DateRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildDateRange();
@@ -1434,7 +1429,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DateRangeValues", () {
     unittest.test("to-json--from-json", () {
       var o = buildDateRangeValues();
@@ -1443,7 +1437,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Dimension", () {
     unittest.test("to-json--from-json", () {
       var o = buildDimension();
@@ -1452,7 +1445,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DimensionFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildDimensionFilter();
@@ -1461,7 +1453,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DimensionFilterClause", () {
     unittest.test("to-json--from-json", () {
       var o = buildDimensionFilterClause();
@@ -1470,7 +1461,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DynamicSegment", () {
     unittest.test("to-json--from-json", () {
       var o = buildDynamicSegment();
@@ -1479,7 +1469,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetReportsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetReportsRequest();
@@ -1488,7 +1477,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetReportsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetReportsResponse();
@@ -1497,7 +1485,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Metric", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetric();
@@ -1506,7 +1493,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricFilter();
@@ -1515,7 +1501,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricFilterClause", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricFilterClause();
@@ -1524,7 +1509,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricHeader", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricHeader();
@@ -1533,7 +1517,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricHeaderEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricHeaderEntry();
@@ -1542,7 +1525,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OrFiltersForSegment", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrFiltersForSegment();
@@ -1551,7 +1533,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OrderBy", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrderBy();
@@ -1560,7 +1541,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Pivot", () {
     unittest.test("to-json--from-json", () {
       var o = buildPivot();
@@ -1569,7 +1549,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PivotHeader", () {
     unittest.test("to-json--from-json", () {
       var o = buildPivotHeader();
@@ -1578,7 +1557,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PivotHeaderEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildPivotHeaderEntry();
@@ -1587,7 +1565,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PivotValueRegion", () {
     unittest.test("to-json--from-json", () {
       var o = buildPivotValueRegion();
@@ -1596,7 +1573,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Report", () {
     unittest.test("to-json--from-json", () {
       var o = buildReport();
@@ -1605,7 +1581,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportData", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportData();
@@ -1614,7 +1589,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequest();
@@ -1623,7 +1597,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRow", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRow();
@@ -1632,7 +1605,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Segment", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegment();
@@ -1641,7 +1613,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentDefinition", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentDefinition();
@@ -1650,7 +1621,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentDimensionFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentDimensionFilter();
@@ -1659,7 +1629,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentFilter();
@@ -1668,7 +1637,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentFilterClause", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentFilterClause();
@@ -1677,7 +1645,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentMetricFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentMetricFilter();
@@ -1686,7 +1653,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentSequenceStep", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentSequenceStep();
@@ -1695,7 +1661,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SequenceSegment", () {
     unittest.test("to-json--from-json", () {
       var o = buildSequenceSegment();
@@ -1704,7 +1669,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SimpleSegment", () {
     unittest.test("to-json--from-json", () {
       var o = buildSimpleSegment();
@@ -1713,10 +1677,8 @@
     });
   });
 
-
   unittest.group("resource-ReportsResourceApi", () {
     unittest.test("method--batchGet", () {
-
       var mock = new HttpServerMock();
       api.ReportsResourceApi res = new api.AnalyticsreportingApi(mock).reports;
       var arg_request = buildGetReportsRequest();
@@ -1728,9 +1690,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("v4/reports:batchGet"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("v4/reports:batchGet"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -1743,27 +1707,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetReportsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.batchGet(arg_request).then(unittest.expectAsync1(((api.GetReportsResponse response) {
+      res
+          .batchGet(arg_request)
+          .then(unittest.expectAsync1(((api.GetReportsResponse response) {
         checkGetReportsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
index 6d0fd4e..26a7b06 100644
--- a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
+++ b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.androiddeviceprovisioning.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/androiddeviceprovisioning/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -95,14 +94,14 @@
   buildCounterClaimDeviceResponse--;
 }
 
-buildUnnamed54() {
+buildUnnamed47() {
   var o = new core.List<api.PartnerClaim>();
   o.add(buildPartnerClaim());
   o.add(buildPartnerClaim());
   return o;
 }
 
-checkUnnamed54(core.List<api.PartnerClaim> o) {
+checkUnnamed47(core.List<api.PartnerClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPartnerClaim(o[0]);
   checkPartnerClaim(o[1]);
@@ -113,7 +112,7 @@
   var o = new api.ClaimDevicesRequest();
   buildCounterClaimDevicesRequest++;
   if (buildCounterClaimDevicesRequest < 3) {
-    o.claims = buildUnnamed54();
+    o.claims = buildUnnamed47();
   }
   buildCounterClaimDevicesRequest--;
   return o;
@@ -122,18 +121,47 @@
 checkClaimDevicesRequest(api.ClaimDevicesRequest o) {
   buildCounterClaimDevicesRequest++;
   if (buildCounterClaimDevicesRequest < 3) {
-    checkUnnamed54(o.claims);
+    checkUnnamed47(o.claims);
   }
   buildCounterClaimDevicesRequest--;
 }
 
+buildUnnamed48() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed48(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed49() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed49(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 core.int buildCounterCompany = 0;
 buildCompany() {
   var o = new api.Company();
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
+    o.adminEmails = buildUnnamed48();
     o.companyId = "foo";
     o.companyName = "foo";
+    o.name = "foo";
+    o.ownerEmails = buildUnnamed49();
   }
   buildCounterCompany--;
   return o;
@@ -142,20 +170,42 @@
 checkCompany(api.Company o) {
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
+    checkUnnamed48(o.adminEmails);
     unittest.expect(o.companyId, unittest.equals('foo'));
     unittest.expect(o.companyName, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed49(o.ownerEmails);
   }
   buildCounterCompany--;
 }
 
-buildUnnamed55() {
+core.int buildCounterCreateCustomerRequest = 0;
+buildCreateCustomerRequest() {
+  var o = new api.CreateCustomerRequest();
+  buildCounterCreateCustomerRequest++;
+  if (buildCounterCreateCustomerRequest < 3) {
+    o.customer = buildCompany();
+  }
+  buildCounterCreateCustomerRequest--;
+  return o;
+}
+
+checkCreateCustomerRequest(api.CreateCustomerRequest o) {
+  buildCounterCreateCustomerRequest++;
+  if (buildCounterCreateCustomerRequest < 3) {
+    checkCompany(o.customer);
+  }
+  buildCounterCreateCustomerRequest--;
+}
+
+buildUnnamed50() {
   var o = new core.List<api.DeviceClaim>();
   o.add(buildDeviceClaim());
   o.add(buildDeviceClaim());
   return o;
 }
 
-checkUnnamed55(core.List<api.DeviceClaim> o) {
+checkUnnamed50(core.List<api.DeviceClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeviceClaim(o[0]);
   checkDeviceClaim(o[1]);
@@ -166,7 +216,8 @@
   var o = new api.Device();
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
-    o.claims = buildUnnamed55();
+    o.claims = buildUnnamed50();
+    o.configuration = "foo";
     o.deviceId = "foo";
     o.deviceIdentifier = buildDeviceIdentifier();
     o.deviceMetadata = buildDeviceMetadata();
@@ -179,7 +230,8 @@
 checkDevice(api.Device o) {
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
-    checkUnnamed55(o.claims);
+    checkUnnamed50(o.claims);
+    unittest.expect(o.configuration, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
     checkDeviceIdentifier(o.deviceIdentifier);
     checkDeviceMetadata(o.deviceMetadata);
@@ -234,14 +286,14 @@
   buildCounterDeviceIdentifier--;
 }
 
-buildUnnamed56() {
+buildUnnamed51() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed56(core.Map<core.String, core.String> o) {
+checkUnnamed51(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -252,7 +304,7 @@
   var o = new api.DeviceMetadata();
   buildCounterDeviceMetadata++;
   if (buildCounterDeviceMetadata < 3) {
-    o.entries = buildUnnamed56();
+    o.entries = buildUnnamed51();
   }
   buildCounterDeviceMetadata--;
   return o;
@@ -261,7 +313,7 @@
 checkDeviceMetadata(api.DeviceMetadata o) {
   buildCounterDeviceMetadata++;
   if (buildCounterDeviceMetadata < 3) {
-    checkUnnamed56(o.entries);
+    checkUnnamed51(o.entries);
   }
   buildCounterDeviceMetadata--;
 }
@@ -279,7 +331,8 @@
   return o;
 }
 
-checkDevicesLongRunningOperationMetadata(api.DevicesLongRunningOperationMetadata o) {
+checkDevicesLongRunningOperationMetadata(
+    api.DevicesLongRunningOperationMetadata o) {
   buildCounterDevicesLongRunningOperationMetadata++;
   if (buildCounterDevicesLongRunningOperationMetadata < 3) {
     unittest.expect(o.devicesCount, unittest.equals(42));
@@ -289,14 +342,14 @@
   buildCounterDevicesLongRunningOperationMetadata--;
 }
 
-buildUnnamed57() {
+buildUnnamed52() {
   var o = new core.List<api.OperationPerDevice>();
   o.add(buildOperationPerDevice());
   o.add(buildOperationPerDevice());
   return o;
 }
 
-checkUnnamed57(core.List<api.OperationPerDevice> o) {
+checkUnnamed52(core.List<api.OperationPerDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationPerDevice(o[0]);
   checkOperationPerDevice(o[1]);
@@ -307,17 +360,18 @@
   var o = new api.DevicesLongRunningOperationResponse();
   buildCounterDevicesLongRunningOperationResponse++;
   if (buildCounterDevicesLongRunningOperationResponse < 3) {
-    o.perDeviceStatus = buildUnnamed57();
+    o.perDeviceStatus = buildUnnamed52();
     o.successCount = 42;
   }
   buildCounterDevicesLongRunningOperationResponse--;
   return o;
 }
 
-checkDevicesLongRunningOperationResponse(api.DevicesLongRunningOperationResponse o) {
+checkDevicesLongRunningOperationResponse(
+    api.DevicesLongRunningOperationResponse o) {
   buildCounterDevicesLongRunningOperationResponse++;
   if (buildCounterDevicesLongRunningOperationResponse < 3) {
-    checkUnnamed57(o.perDeviceStatus);
+    checkUnnamed52(o.perDeviceStatus);
     unittest.expect(o.successCount, unittest.equals(42));
   }
   buildCounterDevicesLongRunningOperationResponse--;
@@ -327,16 +381,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -353,7 +405,8 @@
   return o;
 }
 
-checkFindDevicesByDeviceIdentifierRequest(api.FindDevicesByDeviceIdentifierRequest o) {
+checkFindDevicesByDeviceIdentifierRequest(
+    api.FindDevicesByDeviceIdentifierRequest o) {
   buildCounterFindDevicesByDeviceIdentifierRequest++;
   if (buildCounterFindDevicesByDeviceIdentifierRequest < 3) {
     checkDeviceIdentifier(o.deviceIdentifier);
@@ -363,14 +416,14 @@
   buildCounterFindDevicesByDeviceIdentifierRequest--;
 }
 
-buildUnnamed58() {
+buildUnnamed53() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed58(core.List<api.Device> o) {
+checkUnnamed53(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -381,30 +434,31 @@
   var o = new api.FindDevicesByDeviceIdentifierResponse();
   buildCounterFindDevicesByDeviceIdentifierResponse++;
   if (buildCounterFindDevicesByDeviceIdentifierResponse < 3) {
-    o.devices = buildUnnamed58();
+    o.devices = buildUnnamed53();
     o.nextPageToken = "foo";
   }
   buildCounterFindDevicesByDeviceIdentifierResponse--;
   return o;
 }
 
-checkFindDevicesByDeviceIdentifierResponse(api.FindDevicesByDeviceIdentifierResponse o) {
+checkFindDevicesByDeviceIdentifierResponse(
+    api.FindDevicesByDeviceIdentifierResponse o) {
   buildCounterFindDevicesByDeviceIdentifierResponse++;
   if (buildCounterFindDevicesByDeviceIdentifierResponse < 3) {
-    checkUnnamed58(o.devices);
+    checkUnnamed53(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFindDevicesByDeviceIdentifierResponse--;
 }
 
-buildUnnamed59() {
+buildUnnamed54() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed59(core.List<core.String> o) {
+checkUnnamed54(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -415,7 +469,7 @@
   var o = new api.FindDevicesByOwnerRequest();
   buildCounterFindDevicesByOwnerRequest++;
   if (buildCounterFindDevicesByOwnerRequest < 3) {
-    o.customerId = buildUnnamed59();
+    o.customerId = buildUnnamed54();
     o.limit = "foo";
     o.pageToken = "foo";
     o.sectionType = "foo";
@@ -427,7 +481,7 @@
 checkFindDevicesByOwnerRequest(api.FindDevicesByOwnerRequest o) {
   buildCounterFindDevicesByOwnerRequest++;
   if (buildCounterFindDevicesByOwnerRequest < 3) {
-    checkUnnamed59(o.customerId);
+    checkUnnamed54(o.customerId);
     unittest.expect(o.limit, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.sectionType, unittest.equals('foo'));
@@ -435,14 +489,14 @@
   buildCounterFindDevicesByOwnerRequest--;
 }
 
-buildUnnamed60() {
+buildUnnamed55() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed60(core.List<api.Device> o) {
+checkUnnamed55(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -453,7 +507,7 @@
   var o = new api.FindDevicesByOwnerResponse();
   buildCounterFindDevicesByOwnerResponse++;
   if (buildCounterFindDevicesByOwnerResponse < 3) {
-    o.devices = buildUnnamed60();
+    o.devices = buildUnnamed55();
     o.nextPageToken = "foo";
   }
   buildCounterFindDevicesByOwnerResponse--;
@@ -463,20 +517,20 @@
 checkFindDevicesByOwnerResponse(api.FindDevicesByOwnerResponse o) {
   buildCounterFindDevicesByOwnerResponse++;
   if (buildCounterFindDevicesByOwnerResponse < 3) {
-    checkUnnamed60(o.devices);
+    checkUnnamed55(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFindDevicesByOwnerResponse--;
 }
 
-buildUnnamed61() {
+buildUnnamed56() {
   var o = new core.List<api.Company>();
   o.add(buildCompany());
   o.add(buildCompany());
   return o;
 }
 
-checkUnnamed61(core.List<api.Company> o) {
+checkUnnamed56(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCompany(o[0]);
   checkCompany(o[1]);
@@ -487,7 +541,7 @@
   var o = new api.ListCustomersResponse();
   buildCounterListCustomersResponse++;
   if (buildCounterListCustomersResponse < 3) {
-    o.customers = buildUnnamed61();
+    o.customers = buildUnnamed56();
   }
   buildCounterListCustomersResponse--;
   return o;
@@ -496,35 +550,67 @@
 checkListCustomersResponse(api.ListCustomersResponse o) {
   buildCounterListCustomersResponse++;
   if (buildCounterListCustomersResponse < 3) {
-    checkUnnamed61(o.customers);
+    checkUnnamed56(o.customers);
   }
   buildCounterListCustomersResponse--;
 }
 
-buildUnnamed62() {
+buildUnnamed57() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed62(core.Map<core.String, core.Object> o) {
+checkUnnamed57(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed63() {
+buildUnnamed58() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed63(core.Map<core.String, core.Object> o) {
+checkUnnamed58(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -534,9 +620,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed62();
+    o.metadata = buildUnnamed57();
     o.name = "foo";
-    o.response = buildUnnamed63();
+    o.response = buildUnnamed58();
   }
   buildCounterOperation--;
   return o;
@@ -547,9 +633,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed62(o.metadata);
+    checkUnnamed57(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed63(o.response);
+    checkUnnamed58(o.response);
   }
   buildCounterOperation--;
 }
@@ -652,30 +738,46 @@
   buildCounterPerDeviceStatusInBatch--;
 }
 
-buildUnnamed64() {
+buildUnnamed59() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed64(core.Map<core.String, core.Object> o) {
+checkUnnamed59(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed65() {
+buildUnnamed60() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed64());
-  o.add(buildUnnamed64());
+  o.add(buildUnnamed59());
+  o.add(buildUnnamed59());
   return o;
 }
 
-checkUnnamed65(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed60(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed64(o[0]);
-  checkUnnamed64(o[1]);
+  checkUnnamed59(o[0]);
+  checkUnnamed59(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -684,7 +786,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed65();
+    o.details = buildUnnamed60();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -695,7 +797,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed65(o.details);
+    checkUnnamed60(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -724,14 +826,14 @@
   buildCounterUnclaimDeviceRequest--;
 }
 
-buildUnnamed66() {
+buildUnnamed61() {
   var o = new core.List<api.PartnerUnclaim>();
   o.add(buildPartnerUnclaim());
   o.add(buildPartnerUnclaim());
   return o;
 }
 
-checkUnnamed66(core.List<api.PartnerUnclaim> o) {
+checkUnnamed61(core.List<api.PartnerUnclaim> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPartnerUnclaim(o[0]);
   checkPartnerUnclaim(o[1]);
@@ -742,7 +844,7 @@
   var o = new api.UnclaimDevicesRequest();
   buildCounterUnclaimDevicesRequest++;
   if (buildCounterUnclaimDevicesRequest < 3) {
-    o.unclaims = buildUnnamed66();
+    o.unclaims = buildUnnamed61();
   }
   buildCounterUnclaimDevicesRequest--;
   return o;
@@ -751,19 +853,19 @@
 checkUnclaimDevicesRequest(api.UnclaimDevicesRequest o) {
   buildCounterUnclaimDevicesRequest++;
   if (buildCounterUnclaimDevicesRequest < 3) {
-    checkUnnamed66(o.unclaims);
+    checkUnnamed61(o.unclaims);
   }
   buildCounterUnclaimDevicesRequest--;
 }
 
-buildUnnamed67() {
+buildUnnamed62() {
   var o = new core.List<api.UpdateMetadataArguments>();
   o.add(buildUpdateMetadataArguments());
   o.add(buildUpdateMetadataArguments());
   return o;
 }
 
-checkUnnamed67(core.List<api.UpdateMetadataArguments> o) {
+checkUnnamed62(core.List<api.UpdateMetadataArguments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdateMetadataArguments(o[0]);
   checkUpdateMetadataArguments(o[1]);
@@ -774,16 +876,17 @@
   var o = new api.UpdateDeviceMetadataInBatchRequest();
   buildCounterUpdateDeviceMetadataInBatchRequest++;
   if (buildCounterUpdateDeviceMetadataInBatchRequest < 3) {
-    o.updates = buildUnnamed67();
+    o.updates = buildUnnamed62();
   }
   buildCounterUpdateDeviceMetadataInBatchRequest--;
   return o;
 }
 
-checkUpdateDeviceMetadataInBatchRequest(api.UpdateDeviceMetadataInBatchRequest o) {
+checkUpdateDeviceMetadataInBatchRequest(
+    api.UpdateDeviceMetadataInBatchRequest o) {
   buildCounterUpdateDeviceMetadataInBatchRequest++;
   if (buildCounterUpdateDeviceMetadataInBatchRequest < 3) {
-    checkUnnamed67(o.updates);
+    checkUnnamed62(o.updates);
   }
   buildCounterUpdateDeviceMetadataInBatchRequest--;
 }
@@ -830,7 +933,6 @@
   buildCounterUpdateMetadataArguments--;
 }
 
-
 main() {
   unittest.group("obj-schema-ClaimDeviceRequest", () {
     unittest.test("to-json--from-json", () {
@@ -840,7 +942,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClaimDeviceResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildClaimDeviceResponse();
@@ -849,7 +950,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClaimDevicesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildClaimDevicesRequest();
@@ -858,7 +958,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Company", () {
     unittest.test("to-json--from-json", () {
       var o = buildCompany();
@@ -867,6 +966,13 @@
     });
   });
 
+  unittest.group("obj-schema-CreateCustomerRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCreateCustomerRequest();
+      var od = new api.CreateCustomerRequest.fromJson(o.toJson());
+      checkCreateCustomerRequest(od);
+    });
+  });
 
   unittest.group("obj-schema-Device", () {
     unittest.test("to-json--from-json", () {
@@ -876,7 +982,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeviceClaim", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeviceClaim();
@@ -885,7 +990,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeviceIdentifier", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeviceIdentifier();
@@ -894,7 +998,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeviceMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeviceMetadata();
@@ -903,7 +1006,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DevicesLongRunningOperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevicesLongRunningOperationMetadata();
@@ -912,7 +1014,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DevicesLongRunningOperationResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevicesLongRunningOperationResponse();
@@ -921,7 +1022,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -930,25 +1030,24 @@
     });
   });
 
-
   unittest.group("obj-schema-FindDevicesByDeviceIdentifierRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindDevicesByDeviceIdentifierRequest();
-      var od = new api.FindDevicesByDeviceIdentifierRequest.fromJson(o.toJson());
+      var od =
+          new api.FindDevicesByDeviceIdentifierRequest.fromJson(o.toJson());
       checkFindDevicesByDeviceIdentifierRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-FindDevicesByDeviceIdentifierResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindDevicesByDeviceIdentifierResponse();
-      var od = new api.FindDevicesByDeviceIdentifierResponse.fromJson(o.toJson());
+      var od =
+          new api.FindDevicesByDeviceIdentifierResponse.fromJson(o.toJson());
       checkFindDevicesByDeviceIdentifierResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-FindDevicesByOwnerRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindDevicesByOwnerRequest();
@@ -957,7 +1056,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FindDevicesByOwnerResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindDevicesByOwnerResponse();
@@ -966,7 +1064,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListCustomersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListCustomersResponse();
@@ -975,7 +1072,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -984,7 +1080,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationPerDevice", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationPerDevice();
@@ -993,7 +1088,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PartnerClaim", () {
     unittest.test("to-json--from-json", () {
       var o = buildPartnerClaim();
@@ -1002,7 +1096,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PartnerUnclaim", () {
     unittest.test("to-json--from-json", () {
       var o = buildPartnerUnclaim();
@@ -1011,7 +1104,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PerDeviceStatusInBatch", () {
     unittest.test("to-json--from-json", () {
       var o = buildPerDeviceStatusInBatch();
@@ -1020,7 +1112,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1029,7 +1120,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UnclaimDeviceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUnclaimDeviceRequest();
@@ -1038,7 +1128,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UnclaimDevicesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUnclaimDevicesRequest();
@@ -1047,7 +1136,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateDeviceMetadataInBatchRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateDeviceMetadataInBatchRequest();
@@ -1056,7 +1144,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateDeviceMetadataRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateDeviceMetadataRequest();
@@ -1065,7 +1152,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateMetadataArguments", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateMetadataArguments();
@@ -1074,21 +1160,22 @@
     });
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.AndroiddeviceprovisioningApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1102,16 +1189,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1120,24 +1208,78 @@
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PartnersCustomersResourceApi", () {
-    unittest.test("method--list", () {
-
+    unittest.test("method--create", () {
       var mock = new HttpServerMock();
-      api.PartnersCustomersResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.customers;
+      api.PartnersCustomersResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.customers;
+      var arg_request = buildCreateCustomerRequest();
+      var arg_parent = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.CreateCustomerRequest.fromJson(json);
+        checkCreateCustomerRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildCompany());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.Company response) {
+        checkCompany(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.PartnersCustomersResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.customers;
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1151,33 +1293,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListCustomersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_partnerId).then(unittest.expectAsync1(((api.ListCustomersResponse response) {
+      res
+          .list(arg_partnerId)
+          .then(unittest.expectAsync1(((api.ListCustomersResponse response) {
         checkListCustomersResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PartnersDevicesResourceApi", () {
     unittest.test("method--claim", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildClaimDeviceRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1188,9 +1331,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1204,29 +1349,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildClaimDeviceResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.claim(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.ClaimDeviceResponse response) {
+      res
+          .claim(arg_request, arg_partnerId)
+          .then(unittest.expectAsync1(((api.ClaimDeviceResponse response) {
         checkClaimDeviceResponse(response);
       })));
     });
 
     unittest.test("method--claimAsync", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildClaimDevicesRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1237,9 +1385,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1253,29 +1403,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.claimAsync(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .claimAsync(arg_request, arg_partnerId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--findByIdentifier", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildFindDevicesByDeviceIdentifierRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1286,9 +1439,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1302,29 +1457,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildFindDevicesByDeviceIdentifierResponse());
+        var resp =
+            convert.JSON.encode(buildFindDevicesByDeviceIdentifierResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.findByIdentifier(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.FindDevicesByDeviceIdentifierResponse response) {
+      res.findByIdentifier(arg_request, arg_partnerId).then(unittest
+          .expectAsync1(((api.FindDevicesByDeviceIdentifierResponse response) {
         checkFindDevicesByDeviceIdentifierResponse(response);
       })));
     });
 
     unittest.test("method--findByOwner", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildFindDevicesByOwnerRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1335,9 +1493,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1351,38 +1511,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFindDevicesByOwnerResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.findByOwner(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.FindDevicesByOwnerResponse response) {
+      res.findByOwner(arg_request, arg_partnerId).then(
+          unittest.expectAsync1(((api.FindDevicesByOwnerResponse response) {
         checkFindDevicesByOwnerResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1396,16 +1560,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDevice());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1416,9 +1581,9 @@
     });
 
     unittest.test("method--metadata", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildUpdateDeviceMetadataRequest();
       var arg_metadataOwnerId = "foo";
       var arg_deviceId = "foo";
@@ -1430,9 +1595,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1446,29 +1613,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeviceMetadata());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.metadata(arg_request, arg_metadataOwnerId, arg_deviceId).then(unittest.expectAsync1(((api.DeviceMetadata response) {
+      res
+          .metadata(arg_request, arg_metadataOwnerId, arg_deviceId)
+          .then(unittest.expectAsync1(((api.DeviceMetadata response) {
         checkDeviceMetadata(response);
       })));
     });
 
     unittest.test("method--unclaim", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildUnclaimDeviceRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1479,9 +1649,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1495,29 +1667,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unclaim(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .unclaim(arg_request, arg_partnerId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--unclaimAsync", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildUnclaimDevicesRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1528,9 +1703,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1544,29 +1721,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unclaimAsync(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .unclaimAsync(arg_request, arg_partnerId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--updateMetadataAsync", () {
-
       var mock = new HttpServerMock();
-      api.PartnersDevicesResourceApi res = new api.AndroiddeviceprovisioningApi(mock).partners.devices;
+      api.PartnersDevicesResourceApi res =
+          new api.AndroiddeviceprovisioningApi(mock).partners.devices;
       var arg_request = buildUpdateDeviceMetadataInBatchRequest();
       var arg_partnerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1577,9 +1757,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/partners/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/partners/"));
         pathOffset += 12;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1593,27 +1775,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.updateMetadataAsync(arg_request, arg_partnerId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .updateMetadataAsync(arg_request, arg_partnerId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/androidenterprise/v1_test.dart b/generated/googleapis/test/androidenterprise/v1_test.dart
index e00a19f..a4ab0e6 100644
--- a/generated/googleapis/test/androidenterprise/v1_test.dart
+++ b/generated/googleapis/test/androidenterprise/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.androidenterprise.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/androidenterprise/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -91,14 +90,14 @@
   buildCounterAdministratorWebToken--;
 }
 
-buildUnnamed2158() {
+buildUnnamed2145() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2158(core.List<core.String> o) {
+checkUnnamed2145(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -111,7 +110,7 @@
   if (buildCounterAdministratorWebTokenSpec < 3) {
     o.kind = "foo";
     o.parent = "foo";
-    o.permission = buildUnnamed2158();
+    o.permission = buildUnnamed2145();
   }
   buildCounterAdministratorWebTokenSpec--;
   return o;
@@ -122,7 +121,7 @@
   if (buildCounterAdministratorWebTokenSpec < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
-    checkUnnamed2158(o.permission);
+    checkUnnamed2145(o.permission);
   }
   buildCounterAdministratorWebTokenSpec--;
 }
@@ -148,14 +147,14 @@
   buildCounterAndroidDevicePolicyConfig--;
 }
 
-buildUnnamed2159() {
+buildUnnamed2146() {
   var o = new core.List<api.AppRestrictionsSchemaRestriction>();
   o.add(buildAppRestrictionsSchemaRestriction());
   o.add(buildAppRestrictionsSchemaRestriction());
   return o;
 }
 
-checkUnnamed2159(core.List<api.AppRestrictionsSchemaRestriction> o) {
+checkUnnamed2146(core.List<api.AppRestrictionsSchemaRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppRestrictionsSchemaRestriction(o[0]);
   checkAppRestrictionsSchemaRestriction(o[1]);
@@ -167,7 +166,7 @@
   buildCounterAppRestrictionsSchema++;
   if (buildCounterAppRestrictionsSchema < 3) {
     o.kind = "foo";
-    o.restrictions = buildUnnamed2159();
+    o.restrictions = buildUnnamed2146();
   }
   buildCounterAppRestrictionsSchema--;
   return o;
@@ -177,7 +176,7 @@
   buildCounterAppRestrictionsSchema++;
   if (buildCounterAppRestrictionsSchema < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2159(o.restrictions);
+    checkUnnamed2146(o.restrictions);
   }
   buildCounterAppRestrictionsSchema--;
 }
@@ -201,40 +200,40 @@
   buildCounterAppRestrictionsSchemaChangeEvent--;
 }
 
-buildUnnamed2160() {
+buildUnnamed2147() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2160(core.List<core.String> o) {
+checkUnnamed2147(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2161() {
+buildUnnamed2148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2161(core.List<core.String> o) {
+checkUnnamed2148(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2162() {
+buildUnnamed2149() {
   var o = new core.List<api.AppRestrictionsSchemaRestriction>();
   o.add(buildAppRestrictionsSchemaRestriction());
   o.add(buildAppRestrictionsSchemaRestriction());
   return o;
 }
 
-checkUnnamed2162(core.List<api.AppRestrictionsSchemaRestriction> o) {
+checkUnnamed2149(core.List<api.AppRestrictionsSchemaRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppRestrictionsSchemaRestriction(o[0]);
   checkAppRestrictionsSchemaRestriction(o[1]);
@@ -247,10 +246,10 @@
   if (buildCounterAppRestrictionsSchemaRestriction < 3) {
     o.defaultValue = buildAppRestrictionsSchemaRestrictionRestrictionValue();
     o.description = "foo";
-    o.entry = buildUnnamed2160();
-    o.entryValue = buildUnnamed2161();
+    o.entry = buildUnnamed2147();
+    o.entryValue = buildUnnamed2148();
     o.key = "foo";
-    o.nestedRestriction = buildUnnamed2162();
+    o.nestedRestriction = buildUnnamed2149();
     o.restrictionType = "foo";
     o.title = "foo";
   }
@@ -263,24 +262,24 @@
   if (buildCounterAppRestrictionsSchemaRestriction < 3) {
     checkAppRestrictionsSchemaRestrictionRestrictionValue(o.defaultValue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2160(o.entry);
-    checkUnnamed2161(o.entryValue);
+    checkUnnamed2147(o.entry);
+    checkUnnamed2148(o.entryValue);
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed2162(o.nestedRestriction);
+    checkUnnamed2149(o.nestedRestriction);
     unittest.expect(o.restrictionType, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterAppRestrictionsSchemaRestriction--;
 }
 
-buildUnnamed2163() {
+buildUnnamed2150() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2163(core.List<core.String> o) {
+checkUnnamed2150(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -294,20 +293,21 @@
     o.type = "foo";
     o.valueBool = true;
     o.valueInteger = 42;
-    o.valueMultiselect = buildUnnamed2163();
+    o.valueMultiselect = buildUnnamed2150();
     o.valueString = "foo";
   }
   buildCounterAppRestrictionsSchemaRestrictionRestrictionValue--;
   return o;
 }
 
-checkAppRestrictionsSchemaRestrictionRestrictionValue(api.AppRestrictionsSchemaRestrictionRestrictionValue o) {
+checkAppRestrictionsSchemaRestrictionRestrictionValue(
+    api.AppRestrictionsSchemaRestrictionRestrictionValue o) {
   buildCounterAppRestrictionsSchemaRestrictionRestrictionValue++;
   if (buildCounterAppRestrictionsSchemaRestrictionRestrictionValue < 3) {
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.valueBool, unittest.isTrue);
     unittest.expect(o.valueInteger, unittest.equals(42));
-    checkUnnamed2163(o.valueMultiselect);
+    checkUnnamed2150(o.valueMultiselect);
     unittest.expect(o.valueString, unittest.equals('foo'));
   }
   buildCounterAppRestrictionsSchemaRestrictionRestrictionValue--;
@@ -439,14 +439,14 @@
   buildCounterDeviceState--;
 }
 
-buildUnnamed2164() {
+buildUnnamed2151() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed2164(core.List<api.Device> o) {
+checkUnnamed2151(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -457,7 +457,7 @@
   var o = new api.DevicesListResponse();
   buildCounterDevicesListResponse++;
   if (buildCounterDevicesListResponse < 3) {
-    o.device = buildUnnamed2164();
+    o.device = buildUnnamed2151();
     o.kind = "foo";
   }
   buildCounterDevicesListResponse--;
@@ -467,20 +467,20 @@
 checkDevicesListResponse(api.DevicesListResponse o) {
   buildCounterDevicesListResponse++;
   if (buildCounterDevicesListResponse < 3) {
-    checkUnnamed2164(o.device);
+    checkUnnamed2151(o.device);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDevicesListResponse--;
 }
 
-buildUnnamed2165() {
+buildUnnamed2152() {
   var o = new core.List<api.Administrator>();
   o.add(buildAdministrator());
   o.add(buildAdministrator());
   return o;
 }
 
-checkUnnamed2165(core.List<api.Administrator> o) {
+checkUnnamed2152(core.List<api.Administrator> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrator(o[0]);
   checkAdministrator(o[1]);
@@ -491,7 +491,7 @@
   var o = new api.Enterprise();
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
-    o.administrator = buildUnnamed2165();
+    o.administrator = buildUnnamed2152();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -504,7 +504,7 @@
 checkEnterprise(api.Enterprise o) {
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
-    checkUnnamed2165(o.administrator);
+    checkUnnamed2152(o.administrator);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -534,14 +534,14 @@
   buildCounterEnterpriseAccount--;
 }
 
-buildUnnamed2166() {
+buildUnnamed2153() {
   var o = new core.List<api.Enterprise>();
   o.add(buildEnterprise());
   o.add(buildEnterprise());
   return o;
 }
 
-checkUnnamed2166(core.List<api.Enterprise> o) {
+checkUnnamed2153(core.List<api.Enterprise> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnterprise(o[0]);
   checkEnterprise(o[1]);
@@ -552,7 +552,7 @@
   var o = new api.EnterprisesListResponse();
   buildCounterEnterprisesListResponse++;
   if (buildCounterEnterprisesListResponse < 3) {
-    o.enterprise = buildUnnamed2166();
+    o.enterprise = buildUnnamed2153();
     o.kind = "foo";
   }
   buildCounterEnterprisesListResponse--;
@@ -562,7 +562,7 @@
 checkEnterprisesListResponse(api.EnterprisesListResponse o) {
   buildCounterEnterprisesListResponse++;
   if (buildCounterEnterprisesListResponse < 3) {
-    checkUnnamed2166(o.enterprise);
+    checkUnnamed2153(o.enterprise);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEnterprisesListResponse--;
@@ -580,7 +580,8 @@
   return o;
 }
 
-checkEnterprisesSendTestPushNotificationResponse(api.EnterprisesSendTestPushNotificationResponse o) {
+checkEnterprisesSendTestPushNotificationResponse(
+    api.EnterprisesSendTestPushNotificationResponse o) {
   buildCounterEnterprisesSendTestPushNotificationResponse++;
   if (buildCounterEnterprisesSendTestPushNotificationResponse < 3) {
     unittest.expect(o.messageId, unittest.equals('foo'));
@@ -612,14 +613,14 @@
   buildCounterEntitlement--;
 }
 
-buildUnnamed2167() {
+buildUnnamed2154() {
   var o = new core.List<api.Entitlement>();
   o.add(buildEntitlement());
   o.add(buildEntitlement());
   return o;
 }
 
-checkUnnamed2167(core.List<api.Entitlement> o) {
+checkUnnamed2154(core.List<api.Entitlement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntitlement(o[0]);
   checkEntitlement(o[1]);
@@ -630,7 +631,7 @@
   var o = new api.EntitlementsListResponse();
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
-    o.entitlement = buildUnnamed2167();
+    o.entitlement = buildUnnamed2154();
     o.kind = "foo";
   }
   buildCounterEntitlementsListResponse--;
@@ -640,7 +641,7 @@
 checkEntitlementsListResponse(api.EntitlementsListResponse o) {
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
-    checkUnnamed2167(o.entitlement);
+    checkUnnamed2154(o.entitlement);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEntitlementsListResponse--;
@@ -677,14 +678,14 @@
   buildCounterGroupLicense--;
 }
 
-buildUnnamed2168() {
+buildUnnamed2155() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed2168(core.List<api.User> o) {
+checkUnnamed2155(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -696,7 +697,7 @@
   buildCounterGroupLicenseUsersListResponse++;
   if (buildCounterGroupLicenseUsersListResponse < 3) {
     o.kind = "foo";
-    o.user = buildUnnamed2168();
+    o.user = buildUnnamed2155();
   }
   buildCounterGroupLicenseUsersListResponse--;
   return o;
@@ -706,19 +707,19 @@
   buildCounterGroupLicenseUsersListResponse++;
   if (buildCounterGroupLicenseUsersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2168(o.user);
+    checkUnnamed2155(o.user);
   }
   buildCounterGroupLicenseUsersListResponse--;
 }
 
-buildUnnamed2169() {
+buildUnnamed2156() {
   var o = new core.List<api.GroupLicense>();
   o.add(buildGroupLicense());
   o.add(buildGroupLicense());
   return o;
 }
 
-checkUnnamed2169(core.List<api.GroupLicense> o) {
+checkUnnamed2156(core.List<api.GroupLicense> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroupLicense(o[0]);
   checkGroupLicense(o[1]);
@@ -729,7 +730,7 @@
   var o = new api.GroupLicensesListResponse();
   buildCounterGroupLicensesListResponse++;
   if (buildCounterGroupLicensesListResponse < 3) {
-    o.groupLicense = buildUnnamed2169();
+    o.groupLicense = buildUnnamed2156();
     o.kind = "foo";
   }
   buildCounterGroupLicensesListResponse--;
@@ -739,7 +740,7 @@
 checkGroupLicensesListResponse(api.GroupLicensesListResponse o) {
   buildCounterGroupLicensesListResponse++;
   if (buildCounterGroupLicensesListResponse < 3) {
-    checkUnnamed2169(o.groupLicense);
+    checkUnnamed2156(o.groupLicense);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterGroupLicensesListResponse--;
@@ -797,14 +798,14 @@
   buildCounterInstallFailureEvent--;
 }
 
-buildUnnamed2170() {
+buildUnnamed2157() {
   var o = new core.List<api.Install>();
   o.add(buildInstall());
   o.add(buildInstall());
   return o;
 }
 
-checkUnnamed2170(core.List<api.Install> o) {
+checkUnnamed2157(core.List<api.Install> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstall(o[0]);
   checkInstall(o[1]);
@@ -815,7 +816,7 @@
   var o = new api.InstallsListResponse();
   buildCounterInstallsListResponse++;
   if (buildCounterInstallsListResponse < 3) {
-    o.install = buildUnnamed2170();
+    o.install = buildUnnamed2157();
     o.kind = "foo";
   }
   buildCounterInstallsListResponse--;
@@ -825,7 +826,7 @@
 checkInstallsListResponse(api.InstallsListResponse o) {
   buildCounterInstallsListResponse++;
   if (buildCounterInstallsListResponse < 3) {
-    checkUnnamed2170(o.install);
+    checkUnnamed2157(o.install);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInstallsListResponse--;
@@ -852,14 +853,14 @@
   buildCounterLocalizedText--;
 }
 
-buildUnnamed2171() {
+buildUnnamed2158() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed2171(core.List<api.ManagedProperty> o) {
+checkUnnamed2158(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -871,7 +872,7 @@
   buildCounterManagedConfiguration++;
   if (buildCounterManagedConfiguration < 3) {
     o.kind = "foo";
-    o.managedProperty = buildUnnamed2171();
+    o.managedProperty = buildUnnamed2158();
     o.productId = "foo";
   }
   buildCounterManagedConfiguration--;
@@ -882,20 +883,20 @@
   buildCounterManagedConfiguration++;
   if (buildCounterManagedConfiguration < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2171(o.managedProperty);
+    checkUnnamed2158(o.managedProperty);
     unittest.expect(o.productId, unittest.equals('foo'));
   }
   buildCounterManagedConfiguration--;
 }
 
-buildUnnamed2172() {
+buildUnnamed2159() {
   var o = new core.List<api.ManagedConfiguration>();
   o.add(buildManagedConfiguration());
   o.add(buildManagedConfiguration());
   return o;
 }
 
-checkUnnamed2172(core.List<api.ManagedConfiguration> o) {
+checkUnnamed2159(core.List<api.ManagedConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedConfiguration(o[0]);
   checkManagedConfiguration(o[1]);
@@ -907,29 +908,30 @@
   buildCounterManagedConfigurationsForDeviceListResponse++;
   if (buildCounterManagedConfigurationsForDeviceListResponse < 3) {
     o.kind = "foo";
-    o.managedConfigurationForDevice = buildUnnamed2172();
+    o.managedConfigurationForDevice = buildUnnamed2159();
   }
   buildCounterManagedConfigurationsForDeviceListResponse--;
   return o;
 }
 
-checkManagedConfigurationsForDeviceListResponse(api.ManagedConfigurationsForDeviceListResponse o) {
+checkManagedConfigurationsForDeviceListResponse(
+    api.ManagedConfigurationsForDeviceListResponse o) {
   buildCounterManagedConfigurationsForDeviceListResponse++;
   if (buildCounterManagedConfigurationsForDeviceListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2172(o.managedConfigurationForDevice);
+    checkUnnamed2159(o.managedConfigurationForDevice);
   }
   buildCounterManagedConfigurationsForDeviceListResponse--;
 }
 
-buildUnnamed2173() {
+buildUnnamed2160() {
   var o = new core.List<api.ManagedConfiguration>();
   o.add(buildManagedConfiguration());
   o.add(buildManagedConfiguration());
   return o;
 }
 
-checkUnnamed2173(core.List<api.ManagedConfiguration> o) {
+checkUnnamed2160(core.List<api.ManagedConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedConfiguration(o[0]);
   checkManagedConfiguration(o[1]);
@@ -941,42 +943,43 @@
   buildCounterManagedConfigurationsForUserListResponse++;
   if (buildCounterManagedConfigurationsForUserListResponse < 3) {
     o.kind = "foo";
-    o.managedConfigurationForUser = buildUnnamed2173();
+    o.managedConfigurationForUser = buildUnnamed2160();
   }
   buildCounterManagedConfigurationsForUserListResponse--;
   return o;
 }
 
-checkManagedConfigurationsForUserListResponse(api.ManagedConfigurationsForUserListResponse o) {
+checkManagedConfigurationsForUserListResponse(
+    api.ManagedConfigurationsForUserListResponse o) {
   buildCounterManagedConfigurationsForUserListResponse++;
   if (buildCounterManagedConfigurationsForUserListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2173(o.managedConfigurationForUser);
+    checkUnnamed2160(o.managedConfigurationForUser);
   }
   buildCounterManagedConfigurationsForUserListResponse--;
 }
 
-buildUnnamed2174() {
+buildUnnamed2161() {
   var o = new core.List<api.ManagedPropertyBundle>();
   o.add(buildManagedPropertyBundle());
   o.add(buildManagedPropertyBundle());
   return o;
 }
 
-checkUnnamed2174(core.List<api.ManagedPropertyBundle> o) {
+checkUnnamed2161(core.List<api.ManagedPropertyBundle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedPropertyBundle(o[0]);
   checkManagedPropertyBundle(o[1]);
 }
 
-buildUnnamed2175() {
+buildUnnamed2162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2175(core.List<core.String> o) {
+checkUnnamed2162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -990,10 +993,10 @@
     o.key = "foo";
     o.valueBool = true;
     o.valueBundle = buildManagedPropertyBundle();
-    o.valueBundleArray = buildUnnamed2174();
+    o.valueBundleArray = buildUnnamed2161();
     o.valueInteger = 42;
     o.valueString = "foo";
-    o.valueStringArray = buildUnnamed2175();
+    o.valueStringArray = buildUnnamed2162();
   }
   buildCounterManagedProperty--;
   return o;
@@ -1005,22 +1008,22 @@
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.valueBool, unittest.isTrue);
     checkManagedPropertyBundle(o.valueBundle);
-    checkUnnamed2174(o.valueBundleArray);
+    checkUnnamed2161(o.valueBundleArray);
     unittest.expect(o.valueInteger, unittest.equals(42));
     unittest.expect(o.valueString, unittest.equals('foo'));
-    checkUnnamed2175(o.valueStringArray);
+    checkUnnamed2162(o.valueStringArray);
   }
   buildCounterManagedProperty--;
 }
 
-buildUnnamed2176() {
+buildUnnamed2163() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed2176(core.List<api.ManagedProperty> o) {
+checkUnnamed2163(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -1031,7 +1034,7 @@
   var o = new api.ManagedPropertyBundle();
   buildCounterManagedPropertyBundle++;
   if (buildCounterManagedPropertyBundle < 3) {
-    o.managedProperty = buildUnnamed2176();
+    o.managedProperty = buildUnnamed2163();
   }
   buildCounterManagedPropertyBundle--;
   return o;
@@ -1040,7 +1043,7 @@
 checkManagedPropertyBundle(api.ManagedPropertyBundle o) {
   buildCounterManagedPropertyBundle++;
   if (buildCounterManagedPropertyBundle < 3) {
-    checkUnnamed2176(o.managedProperty);
+    checkUnnamed2163(o.managedProperty);
   }
   buildCounterManagedPropertyBundle--;
 }
@@ -1068,27 +1071,27 @@
   buildCounterNewDeviceEvent--;
 }
 
-buildUnnamed2177() {
+buildUnnamed2164() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2177(core.List<core.String> o) {
+checkUnnamed2164(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2178() {
+buildUnnamed2165() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2178(core.List<core.String> o) {
+checkUnnamed2165(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1099,9 +1102,9 @@
   var o = new api.NewPermissionsEvent();
   buildCounterNewPermissionsEvent++;
   if (buildCounterNewPermissionsEvent < 3) {
-    o.approvedPermissions = buildUnnamed2177();
+    o.approvedPermissions = buildUnnamed2164();
     o.productId = "foo";
-    o.requestedPermissions = buildUnnamed2178();
+    o.requestedPermissions = buildUnnamed2165();
   }
   buildCounterNewPermissionsEvent--;
   return o;
@@ -1110,9 +1113,9 @@
 checkNewPermissionsEvent(api.NewPermissionsEvent o) {
   buildCounterNewPermissionsEvent++;
   if (buildCounterNewPermissionsEvent < 3) {
-    checkUnnamed2177(o.approvedPermissions);
+    checkUnnamed2164(o.approvedPermissions);
     unittest.expect(o.productId, unittest.equals('foo'));
-    checkUnnamed2178(o.requestedPermissions);
+    checkUnnamed2165(o.requestedPermissions);
   }
   buildCounterNewPermissionsEvent--;
 }
@@ -1122,7 +1125,8 @@
   var o = new api.Notification();
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
-    o.appRestrictionsSchemaChangeEvent = buildAppRestrictionsSchemaChangeEvent();
+    o.appRestrictionsSchemaChangeEvent =
+        buildAppRestrictionsSchemaChangeEvent();
     o.appUpdateEvent = buildAppUpdateEvent();
     o.enterpriseId = "foo";
     o.installFailureEvent = buildInstallFailureEvent();
@@ -1154,14 +1158,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed2179() {
+buildUnnamed2166() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed2179(core.List<api.Notification> o) {
+checkUnnamed2166(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -1173,7 +1177,7 @@
   buildCounterNotificationSet++;
   if (buildCounterNotificationSet < 3) {
     o.kind = "foo";
-    o.notification = buildUnnamed2179();
+    o.notification = buildUnnamed2166();
     o.notificationSetId = "foo";
   }
   buildCounterNotificationSet--;
@@ -1184,7 +1188,7 @@
   buildCounterNotificationSet++;
   if (buildCounterNotificationSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2179(o.notification);
+    checkUnnamed2166(o.notification);
     unittest.expect(o.notificationSetId, unittest.equals('foo'));
   }
   buildCounterNotificationSet--;
@@ -1238,14 +1242,14 @@
   buildCounterPermission--;
 }
 
-buildUnnamed2180() {
+buildUnnamed2167() {
   var o = new core.List<api.AppVersion>();
   o.add(buildAppVersion());
   o.add(buildAppVersion());
   return o;
 }
 
-checkUnnamed2180(core.List<api.AppVersion> o) {
+checkUnnamed2167(core.List<api.AppVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppVersion(o[0]);
   checkAppVersion(o[1]);
@@ -1256,7 +1260,7 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.appVersion = buildUnnamed2180();
+    o.appVersion = buildUnnamed2167();
     o.authorName = "foo";
     o.detailsUrl = "foo";
     o.distributionChannel = "foo";
@@ -1265,6 +1269,7 @@
     o.productId = "foo";
     o.productPricing = "foo";
     o.requiresContainerApp = true;
+    o.signingCertificate = buildProductSigningCertificate();
     o.smallIconUrl = "foo";
     o.title = "foo";
     o.workDetailsUrl = "foo";
@@ -1276,7 +1281,7 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed2180(o.appVersion);
+    checkUnnamed2167(o.appVersion);
     unittest.expect(o.authorName, unittest.equals('foo'));
     unittest.expect(o.detailsUrl, unittest.equals('foo'));
     unittest.expect(o.distributionChannel, unittest.equals('foo'));
@@ -1285,6 +1290,7 @@
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productPricing, unittest.equals('foo'));
     unittest.expect(o.requiresContainerApp, unittest.isTrue);
+    checkProductSigningCertificate(o.signingCertificate);
     unittest.expect(o.smallIconUrl, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.workDetailsUrl, unittest.equals('foo'));
@@ -1355,14 +1361,14 @@
   buildCounterProductPermission--;
 }
 
-buildUnnamed2181() {
+buildUnnamed2168() {
   var o = new core.List<api.ProductPermission>();
   o.add(buildProductPermission());
   o.add(buildProductPermission());
   return o;
 }
 
-checkUnnamed2181(core.List<api.ProductPermission> o) {
+checkUnnamed2168(core.List<api.ProductPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductPermission(o[0]);
   checkProductPermission(o[1]);
@@ -1374,7 +1380,7 @@
   buildCounterProductPermissions++;
   if (buildCounterProductPermissions < 3) {
     o.kind = "foo";
-    o.permission = buildUnnamed2181();
+    o.permission = buildUnnamed2168();
     o.productId = "foo";
   }
   buildCounterProductPermissions--;
@@ -1385,20 +1391,20 @@
   buildCounterProductPermissions++;
   if (buildCounterProductPermissions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2181(o.permission);
+    checkUnnamed2168(o.permission);
     unittest.expect(o.productId, unittest.equals('foo'));
   }
   buildCounterProductPermissions--;
 }
 
-buildUnnamed2182() {
+buildUnnamed2169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2182(core.List<core.String> o) {
+checkUnnamed2169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1410,7 +1416,7 @@
   buildCounterProductSet++;
   if (buildCounterProductSet < 3) {
     o.kind = "foo";
-    o.productId = buildUnnamed2182();
+    o.productId = buildUnnamed2169();
     o.productSetBehavior = "foo";
   }
   buildCounterProductSet--;
@@ -1421,12 +1427,33 @@
   buildCounterProductSet++;
   if (buildCounterProductSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2182(o.productId);
+    checkUnnamed2169(o.productId);
     unittest.expect(o.productSetBehavior, unittest.equals('foo'));
   }
   buildCounterProductSet--;
 }
 
+core.int buildCounterProductSigningCertificate = 0;
+buildProductSigningCertificate() {
+  var o = new api.ProductSigningCertificate();
+  buildCounterProductSigningCertificate++;
+  if (buildCounterProductSigningCertificate < 3) {
+    o.certificateHashSha1 = "foo";
+    o.certificateHashSha256 = "foo";
+  }
+  buildCounterProductSigningCertificate--;
+  return o;
+}
+
+checkProductSigningCertificate(api.ProductSigningCertificate o) {
+  buildCounterProductSigningCertificate++;
+  if (buildCounterProductSigningCertificate < 3) {
+    unittest.expect(o.certificateHashSha1, unittest.equals('foo'));
+    unittest.expect(o.certificateHashSha256, unittest.equals('foo'));
+  }
+  buildCounterProductSigningCertificate--;
+}
+
 core.int buildCounterProductsApproveRequest = 0;
 buildProductsApproveRequest() {
   var o = new api.ProductsApproveRequest();
@@ -1459,7 +1486,8 @@
   return o;
 }
 
-checkProductsGenerateApprovalUrlResponse(api.ProductsGenerateApprovalUrlResponse o) {
+checkProductsGenerateApprovalUrlResponse(
+    api.ProductsGenerateApprovalUrlResponse o) {
   buildCounterProductsGenerateApprovalUrlResponse++;
   if (buildCounterProductsGenerateApprovalUrlResponse < 3) {
     unittest.expect(o.url, unittest.equals('foo'));
@@ -1467,14 +1495,14 @@
   buildCounterProductsGenerateApprovalUrlResponse--;
 }
 
-buildUnnamed2183() {
+buildUnnamed2170() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed2183(core.List<api.Product> o) {
+checkUnnamed2170(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -1487,7 +1515,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
-    o.product = buildUnnamed2183();
+    o.product = buildUnnamed2170();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterProductsListResponse--;
@@ -1499,7 +1527,7 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
-    checkUnnamed2183(o.product);
+    checkUnnamed2170(o.product);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterProductsListResponse--;
@@ -1555,14 +1583,14 @@
   buildCounterServiceAccountKey--;
 }
 
-buildUnnamed2184() {
+buildUnnamed2171() {
   var o = new core.List<api.ServiceAccountKey>();
   o.add(buildServiceAccountKey());
   o.add(buildServiceAccountKey());
   return o;
 }
 
-checkUnnamed2184(core.List<api.ServiceAccountKey> o) {
+checkUnnamed2171(core.List<api.ServiceAccountKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccountKey(o[0]);
   checkServiceAccountKey(o[1]);
@@ -1573,7 +1601,7 @@
   var o = new api.ServiceAccountKeysListResponse();
   buildCounterServiceAccountKeysListResponse++;
   if (buildCounterServiceAccountKeysListResponse < 3) {
-    o.serviceAccountKey = buildUnnamed2184();
+    o.serviceAccountKey = buildUnnamed2171();
   }
   buildCounterServiceAccountKeysListResponse--;
   return o;
@@ -1582,7 +1610,7 @@
 checkServiceAccountKeysListResponse(api.ServiceAccountKeysListResponse o) {
   buildCounterServiceAccountKeysListResponse++;
   if (buildCounterServiceAccountKeysListResponse < 3) {
-    checkUnnamed2184(o.serviceAccountKey);
+    checkUnnamed2171(o.serviceAccountKey);
   }
   buildCounterServiceAccountKeysListResponse--;
 }
@@ -1610,27 +1638,27 @@
   buildCounterSignupInfo--;
 }
 
-buildUnnamed2185() {
+buildUnnamed2172() {
   var o = new core.List<api.LocalizedText>();
   o.add(buildLocalizedText());
   o.add(buildLocalizedText());
   return o;
 }
 
-checkUnnamed2185(core.List<api.LocalizedText> o) {
+checkUnnamed2172(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedText(o[0]);
   checkLocalizedText(o[1]);
 }
 
-buildUnnamed2186() {
+buildUnnamed2173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2186(core.List<core.String> o) {
+checkUnnamed2173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1643,9 +1671,9 @@
   if (buildCounterStoreCluster < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.name = buildUnnamed2185();
+    o.name = buildUnnamed2172();
     o.orderInPage = "foo";
-    o.productId = buildUnnamed2186();
+    o.productId = buildUnnamed2173();
   }
   buildCounterStoreCluster--;
   return o;
@@ -1656,9 +1684,9 @@
   if (buildCounterStoreCluster < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2185(o.name);
+    checkUnnamed2172(o.name);
     unittest.expect(o.orderInPage, unittest.equals('foo'));
-    checkUnnamed2186(o.productId);
+    checkUnnamed2173(o.productId);
   }
   buildCounterStoreCluster--;
 }
@@ -1686,14 +1714,14 @@
   buildCounterStoreLayout--;
 }
 
-buildUnnamed2187() {
+buildUnnamed2174() {
   var o = new core.List<api.StoreCluster>();
   o.add(buildStoreCluster());
   o.add(buildStoreCluster());
   return o;
 }
 
-checkUnnamed2187(core.List<api.StoreCluster> o) {
+checkUnnamed2174(core.List<api.StoreCluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStoreCluster(o[0]);
   checkStoreCluster(o[1]);
@@ -1704,7 +1732,7 @@
   var o = new api.StoreLayoutClustersListResponse();
   buildCounterStoreLayoutClustersListResponse++;
   if (buildCounterStoreLayoutClustersListResponse < 3) {
-    o.cluster = buildUnnamed2187();
+    o.cluster = buildUnnamed2174();
     o.kind = "foo";
   }
   buildCounterStoreLayoutClustersListResponse--;
@@ -1714,20 +1742,20 @@
 checkStoreLayoutClustersListResponse(api.StoreLayoutClustersListResponse o) {
   buildCounterStoreLayoutClustersListResponse++;
   if (buildCounterStoreLayoutClustersListResponse < 3) {
-    checkUnnamed2187(o.cluster);
+    checkUnnamed2174(o.cluster);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterStoreLayoutClustersListResponse--;
 }
 
-buildUnnamed2188() {
+buildUnnamed2175() {
   var o = new core.List<api.StorePage>();
   o.add(buildStorePage());
   o.add(buildStorePage());
   return o;
 }
 
-checkUnnamed2188(core.List<api.StorePage> o) {
+checkUnnamed2175(core.List<api.StorePage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStorePage(o[0]);
   checkStorePage(o[1]);
@@ -1739,7 +1767,7 @@
   buildCounterStoreLayoutPagesListResponse++;
   if (buildCounterStoreLayoutPagesListResponse < 3) {
     o.kind = "foo";
-    o.page = buildUnnamed2188();
+    o.page = buildUnnamed2175();
   }
   buildCounterStoreLayoutPagesListResponse--;
   return o;
@@ -1749,32 +1777,32 @@
   buildCounterStoreLayoutPagesListResponse++;
   if (buildCounterStoreLayoutPagesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2188(o.page);
+    checkUnnamed2175(o.page);
   }
   buildCounterStoreLayoutPagesListResponse--;
 }
 
-buildUnnamed2189() {
+buildUnnamed2176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2189(core.List<core.String> o) {
+checkUnnamed2176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2190() {
+buildUnnamed2177() {
   var o = new core.List<api.LocalizedText>();
   o.add(buildLocalizedText());
   o.add(buildLocalizedText());
   return o;
 }
 
-checkUnnamed2190(core.List<api.LocalizedText> o) {
+checkUnnamed2177(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedText(o[0]);
   checkLocalizedText(o[1]);
@@ -1787,8 +1815,8 @@
   if (buildCounterStorePage < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.link = buildUnnamed2189();
-    o.name = buildUnnamed2190();
+    o.link = buildUnnamed2176();
+    o.name = buildUnnamed2177();
   }
   buildCounterStorePage--;
   return o;
@@ -1799,8 +1827,8 @@
   if (buildCounterStorePage < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2189(o.link);
-    checkUnnamed2190(o.name);
+    checkUnnamed2176(o.link);
+    checkUnnamed2177(o.name);
   }
   buildCounterStorePage--;
 }
@@ -1880,14 +1908,14 @@
   buildCounterUserToken--;
 }
 
-buildUnnamed2191() {
+buildUnnamed2178() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed2191(core.List<api.User> o) {
+checkUnnamed2178(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -1899,7 +1927,7 @@
   buildCounterUsersListResponse++;
   if (buildCounterUsersListResponse < 3) {
     o.kind = "foo";
-    o.user = buildUnnamed2191();
+    o.user = buildUnnamed2178();
   }
   buildCounterUsersListResponse--;
   return o;
@@ -1909,12 +1937,11 @@
   buildCounterUsersListResponse++;
   if (buildCounterUsersListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2191(o.user);
+    checkUnnamed2178(o.user);
   }
   buildCounterUsersListResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-Administrator", () {
     unittest.test("to-json--from-json", () {
@@ -1924,7 +1951,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AdministratorWebToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildAdministratorWebToken();
@@ -1933,7 +1959,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AdministratorWebTokenSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildAdministratorWebTokenSpec();
@@ -1942,7 +1967,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AndroidDevicePolicyConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAndroidDevicePolicyConfig();
@@ -1951,7 +1975,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppRestrictionsSchema", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppRestrictionsSchema();
@@ -1960,7 +1983,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppRestrictionsSchemaChangeEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppRestrictionsSchemaChangeEvent();
@@ -1969,7 +1991,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppRestrictionsSchemaRestriction", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppRestrictionsSchemaRestriction();
@@ -1978,16 +1999,17 @@
     });
   });
 
-
-  unittest.group("obj-schema-AppRestrictionsSchemaRestrictionRestrictionValue", () {
+  unittest.group("obj-schema-AppRestrictionsSchemaRestrictionRestrictionValue",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildAppRestrictionsSchemaRestrictionRestrictionValue();
-      var od = new api.AppRestrictionsSchemaRestrictionRestrictionValue.fromJson(o.toJson());
+      var od =
+          new api.AppRestrictionsSchemaRestrictionRestrictionValue.fromJson(
+              o.toJson());
       checkAppRestrictionsSchemaRestrictionRestrictionValue(od);
     });
   });
 
-
   unittest.group("obj-schema-AppUpdateEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppUpdateEvent();
@@ -1996,7 +2018,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppVersion", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppVersion();
@@ -2005,7 +2026,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApprovalUrlInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildApprovalUrlInfo();
@@ -2014,7 +2034,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthenticationToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthenticationToken();
@@ -2023,7 +2042,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Device", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevice();
@@ -2032,7 +2050,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeviceState", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeviceState();
@@ -2041,7 +2058,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DevicesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevicesListResponse();
@@ -2050,7 +2066,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Enterprise", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnterprise();
@@ -2059,7 +2074,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnterpriseAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnterpriseAccount();
@@ -2068,7 +2082,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnterprisesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnterprisesListResponse();
@@ -2077,16 +2090,15 @@
     });
   });
 
-
   unittest.group("obj-schema-EnterprisesSendTestPushNotificationResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnterprisesSendTestPushNotificationResponse();
-      var od = new api.EnterprisesSendTestPushNotificationResponse.fromJson(o.toJson());
+      var od = new api.EnterprisesSendTestPushNotificationResponse.fromJson(
+          o.toJson());
       checkEnterprisesSendTestPushNotificationResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-Entitlement", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntitlement();
@@ -2095,7 +2107,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntitlementsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntitlementsListResponse();
@@ -2104,7 +2115,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupLicense", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupLicense();
@@ -2113,7 +2123,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupLicenseUsersListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupLicenseUsersListResponse();
@@ -2122,7 +2131,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupLicensesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupLicensesListResponse();
@@ -2131,7 +2139,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Install", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstall();
@@ -2140,7 +2147,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstallFailureEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstallFailureEvent();
@@ -2149,7 +2155,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstallsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstallsListResponse();
@@ -2158,7 +2163,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocalizedText", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocalizedText();
@@ -2167,7 +2171,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedConfiguration", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedConfiguration();
@@ -2176,25 +2179,24 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedConfigurationsForDeviceListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedConfigurationsForDeviceListResponse();
-      var od = new api.ManagedConfigurationsForDeviceListResponse.fromJson(o.toJson());
+      var od = new api.ManagedConfigurationsForDeviceListResponse.fromJson(
+          o.toJson());
       checkManagedConfigurationsForDeviceListResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-ManagedConfigurationsForUserListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedConfigurationsForUserListResponse();
-      var od = new api.ManagedConfigurationsForUserListResponse.fromJson(o.toJson());
+      var od =
+          new api.ManagedConfigurationsForUserListResponse.fromJson(o.toJson());
       checkManagedConfigurationsForUserListResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-ManagedProperty", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedProperty();
@@ -2203,7 +2205,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedPropertyBundle", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedPropertyBundle();
@@ -2212,7 +2213,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NewDeviceEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildNewDeviceEvent();
@@ -2221,7 +2221,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NewPermissionsEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildNewPermissionsEvent();
@@ -2230,7 +2229,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Notification", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotification();
@@ -2239,7 +2237,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NotificationSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotificationSet();
@@ -2248,7 +2245,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageInfo();
@@ -2257,7 +2253,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Permission", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermission();
@@ -2266,7 +2261,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Product", () {
     unittest.test("to-json--from-json", () {
       var o = buildProduct();
@@ -2275,7 +2269,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductApprovalEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductApprovalEvent();
@@ -2284,7 +2277,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductAvailabilityChangeEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductAvailabilityChangeEvent();
@@ -2293,7 +2285,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductPermission", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductPermission();
@@ -2302,7 +2293,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductPermissions", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductPermissions();
@@ -2311,7 +2301,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductSet();
@@ -2320,6 +2309,13 @@
     });
   });
 
+  unittest.group("obj-schema-ProductSigningCertificate", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildProductSigningCertificate();
+      var od = new api.ProductSigningCertificate.fromJson(o.toJson());
+      checkProductSigningCertificate(od);
+    });
+  });
 
   unittest.group("obj-schema-ProductsApproveRequest", () {
     unittest.test("to-json--from-json", () {
@@ -2329,7 +2325,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductsGenerateApprovalUrlResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductsGenerateApprovalUrlResponse();
@@ -2338,7 +2333,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductsListResponse();
@@ -2347,7 +2341,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ServiceAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildServiceAccount();
@@ -2356,7 +2349,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ServiceAccountKey", () {
     unittest.test("to-json--from-json", () {
       var o = buildServiceAccountKey();
@@ -2365,7 +2357,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ServiceAccountKeysListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildServiceAccountKeysListResponse();
@@ -2374,7 +2365,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SignupInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSignupInfo();
@@ -2383,7 +2373,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StoreCluster", () {
     unittest.test("to-json--from-json", () {
       var o = buildStoreCluster();
@@ -2392,7 +2381,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StoreLayout", () {
     unittest.test("to-json--from-json", () {
       var o = buildStoreLayout();
@@ -2401,7 +2389,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StoreLayoutClustersListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildStoreLayoutClustersListResponse();
@@ -2410,7 +2397,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StoreLayoutPagesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildStoreLayoutPagesListResponse();
@@ -2419,7 +2405,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StorePage", () {
     unittest.test("to-json--from-json", () {
       var o = buildStorePage();
@@ -2428,7 +2413,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TokenPagination", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokenPagination();
@@ -2437,7 +2421,6 @@
     });
   });
 
-
   unittest.group("obj-schema-User", () {
     unittest.test("to-json--from-json", () {
       var o = buildUser();
@@ -2446,7 +2429,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserToken();
@@ -2455,7 +2437,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsersListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsersListResponse();
@@ -2464,10 +2445,8 @@
     });
   });
 
-
   unittest.group("resource-DevicesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DevicesResourceApi res = new api.AndroidenterpriseApi(mock).devices;
       var arg_enterpriseId = "foo";
@@ -2478,25 +2457,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2512,27 +2498,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDevice());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_userId, arg_deviceId).then(unittest.expectAsync1(((api.Device response) {
+      res
+          .get(arg_enterpriseId, arg_userId, arg_deviceId)
+          .then(unittest.expectAsync1(((api.Device response) {
         checkDevice(response);
       })));
     });
 
     unittest.test("method--getState", () {
-
       var mock = new HttpServerMock();
       api.DevicesResourceApi res = new api.AndroidenterpriseApi(mock).devices;
       var arg_enterpriseId = "foo";
@@ -2543,32 +2531,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/state", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/state"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/state"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2581,27 +2578,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeviceState());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getState(arg_enterpriseId, arg_userId, arg_deviceId).then(unittest.expectAsync1(((api.DeviceState response) {
+      res
+          .getState(arg_enterpriseId, arg_userId, arg_deviceId)
+          .then(unittest.expectAsync1(((api.DeviceState response) {
         checkDeviceState(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.DevicesResourceApi res = new api.AndroidenterpriseApi(mock).devices;
       var arg_enterpriseId = "foo";
@@ -2611,25 +2610,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/devices"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/devices"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -2642,27 +2648,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDevicesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.DevicesListResponse response) {
+      res
+          .list(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.DevicesListResponse response) {
         checkDevicesListResponse(response);
       })));
     });
 
     unittest.test("method--setState", () {
-
       var mock = new HttpServerMock();
       api.DevicesResourceApi res = new api.AndroidenterpriseApi(mock).devices;
       var arg_request = buildDeviceState();
@@ -2677,32 +2685,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/state", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/state"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/state"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2715,44 +2732,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeviceState());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setState(arg_request, arg_enterpriseId, arg_userId, arg_deviceId).then(unittest.expectAsync1(((api.DeviceState response) {
+      res
+          .setState(arg_request, arg_enterpriseId, arg_userId, arg_deviceId)
+          .then(unittest.expectAsync1(((api.DeviceState response) {
         checkDeviceState(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesResourceApi", () {
     unittest.test("method--acknowledgeNotificationSet", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_notificationSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 38), unittest.equals("enterprises/acknowledgeNotificationSet"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 38),
+            unittest.equals("enterprises/acknowledgeNotificationSet"));
         pathOffset += 38;
 
         var query = (req.url).query;
@@ -2765,28 +2786,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["notificationSetId"].first, unittest.equals(arg_notificationSetId));
-
+        unittest.expect(queryMap["notificationSetId"].first,
+            unittest.equals(arg_notificationSetId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.acknowledgeNotificationSet(notificationSetId: arg_notificationSetId).then(unittest.expectAsync1((_) {}));
+      res
+          .acknowledgeNotificationSet(notificationSetId: arg_notificationSetId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--completeSignup", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_completionToken = "foo";
       var arg_enterpriseToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2794,11 +2819,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("enterprises/completeSignup"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("enterprises/completeSignup"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -2811,31 +2839,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["completionToken"].first, unittest.equals(arg_completionToken));
-        unittest.expect(queryMap["enterpriseToken"].first, unittest.equals(arg_enterpriseToken));
-
+        unittest.expect(queryMap["completionToken"].first,
+            unittest.equals(arg_completionToken));
+        unittest.expect(queryMap["enterpriseToken"].first,
+            unittest.equals(arg_enterpriseToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.completeSignup(completionToken: arg_completionToken, enterpriseToken: arg_enterpriseToken).then(unittest.expectAsync1(((api.Enterprise response) {
+      res
+          .completeSignup(
+              completionToken: arg_completionToken,
+              enterpriseToken: arg_enterpriseToken)
+          .then(unittest.expectAsync1(((api.Enterprise response) {
         checkEnterprise(response);
       })));
     });
 
     unittest.test("method--createWebToken", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_request = buildAdministratorWebTokenSpec();
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2846,18 +2881,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/createWebToken", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/createWebToken"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/createWebToken"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -2870,40 +2910,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAdministratorWebToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.createWebToken(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.AdministratorWebToken response) {
+      res
+          .createWebToken(arg_request, arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.AdministratorWebToken response) {
         checkAdministratorWebToken(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2919,16 +2965,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2937,9 +2984,9 @@
     });
 
     unittest.test("method--enroll", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_request = buildEnterprise();
       var arg_token = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2950,11 +2997,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("enterprises/enroll"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("enterprises/enroll"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -2967,41 +3017,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.enroll(arg_request, arg_token).then(unittest.expectAsync1(((api.Enterprise response) {
+      res
+          .enroll(arg_request, arg_token)
+          .then(unittest.expectAsync1(((api.Enterprise response) {
         checkEnterprise(response);
       })));
     });
 
     unittest.test("method--generateSignupUrl", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_callbackUrl = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("enterprises/signupUrl"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("enterprises/signupUrl"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -3014,41 +3070,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["callbackUrl"].first, unittest.equals(arg_callbackUrl));
-
+        unittest.expect(
+            queryMap["callbackUrl"].first, unittest.equals(arg_callbackUrl));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSignupInfo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateSignupUrl(callbackUrl: arg_callbackUrl).then(unittest.expectAsync1(((api.SignupInfo response) {
+      res
+          .generateSignupUrl(callbackUrl: arg_callbackUrl)
+          .then(unittest.expectAsync1(((api.SignupInfo response) {
         checkSignupInfo(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3064,47 +3127,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId).then(unittest.expectAsync1(((api.Enterprise response) {
+      res
+          .get(arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.Enterprise response) {
         checkEnterprise(response);
       })));
     });
 
     unittest.test("method--getAndroidDevicePolicyConfig", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/androidDevicePolicyConfig", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/androidDevicePolicyConfig"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("/androidDevicePolicyConfig"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -3117,29 +3188,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAndroidDevicePolicyConfig());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getAndroidDevicePolicyConfig(arg_enterpriseId).then(unittest.expectAsync1(((api.AndroidDevicePolicyConfig response) {
+      res.getAndroidDevicePolicyConfig(arg_enterpriseId).then(
+          unittest.expectAsync1(((api.AndroidDevicePolicyConfig response) {
         checkAndroidDevicePolicyConfig(response);
       })));
     });
 
     unittest.test("method--getServiceAccount", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       var arg_keyType = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3147,18 +3220,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/serviceAccount", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/serviceAccount"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/serviceAccount"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -3171,48 +3249,57 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["keyType"].first, unittest.equals(arg_keyType));
-
+        unittest.expect(
+            queryMap["keyType"].first, unittest.equals(arg_keyType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildServiceAccount());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getServiceAccount(arg_enterpriseId, keyType: arg_keyType).then(unittest.expectAsync1(((api.ServiceAccount response) {
+      res
+          .getServiceAccount(arg_enterpriseId, keyType: arg_keyType)
+          .then(unittest.expectAsync1(((api.ServiceAccount response) {
         checkServiceAccount(response);
       })));
     });
 
     unittest.test("method--getStoreLayout", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storeLayout"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/storeLayout"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -3225,29 +3312,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreLayout());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getStoreLayout(arg_enterpriseId).then(unittest.expectAsync1(((api.StoreLayout response) {
+      res
+          .getStoreLayout(arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.StoreLayout response) {
         checkStoreLayout(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_request = buildEnterprise();
       var arg_token = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3258,11 +3348,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("enterprises"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("enterprises"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -3275,41 +3368,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_token).then(unittest.expectAsync1(((api.Enterprise response) {
+      res
+          .insert(arg_request, arg_token)
+          .then(unittest.expectAsync1(((api.Enterprise response) {
         checkEnterprise(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_domain = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("enterprises"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("enterprises"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -3322,41 +3421,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["domain"].first, unittest.equals(arg_domain));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprisesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_domain).then(unittest.expectAsync1(((api.EnterprisesListResponse response) {
+      res
+          .list(arg_domain)
+          .then(unittest.expectAsync1(((api.EnterprisesListResponse response) {
         checkEnterprisesListResponse(response);
       })));
     });
 
     unittest.test("method--pullNotificationSet", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_requestMode = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("enterprises/pullNotificationSet"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 31),
+            unittest.equals("enterprises/pullNotificationSet"));
         pathOffset += 31;
 
         var query = (req.url).query;
@@ -3369,48 +3474,57 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestMode"].first, unittest.equals(arg_requestMode));
-
+        unittest.expect(
+            queryMap["requestMode"].first, unittest.equals(arg_requestMode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNotificationSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.pullNotificationSet(requestMode: arg_requestMode).then(unittest.expectAsync1(((api.NotificationSet response) {
+      res
+          .pullNotificationSet(requestMode: arg_requestMode)
+          .then(unittest.expectAsync1(((api.NotificationSet response) {
         checkNotificationSet(response);
       })));
     });
 
     unittest.test("method--sendTestPushNotification", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/sendTestPushNotification", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/sendTestPushNotification"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("/sendTestPushNotification"));
         pathOffset += 25;
 
         var query = (req.url).query;
@@ -3423,29 +3537,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildEnterprisesSendTestPushNotificationResponse());
+        var resp = convert.JSON
+            .encode(buildEnterprisesSendTestPushNotificationResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.sendTestPushNotification(arg_enterpriseId).then(unittest.expectAsync1(((api.EnterprisesSendTestPushNotificationResponse response) {
+      res.sendTestPushNotification(arg_enterpriseId).then(unittest.expectAsync1(
+          ((api.EnterprisesSendTestPushNotificationResponse response) {
         checkEnterprisesSendTestPushNotificationResponse(response);
       })));
     });
 
     unittest.test("method--setAccount", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_request = buildEnterpriseAccount();
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3456,18 +3573,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/account", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/account"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/account"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -3480,29 +3602,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterpriseAccount());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setAccount(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.EnterpriseAccount response) {
+      res
+          .setAccount(arg_request, arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.EnterpriseAccount response) {
         checkEnterpriseAccount(response);
       })));
     });
 
     unittest.test("method--setAndroidDevicePolicyConfig", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_request = buildAndroidDevicePolicyConfig();
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3513,18 +3638,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/androidDevicePolicyConfig", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/androidDevicePolicyConfig"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("/androidDevicePolicyConfig"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -3537,29 +3667,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAndroidDevicePolicyConfig());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setAndroidDevicePolicyConfig(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.AndroidDevicePolicyConfig response) {
+      res.setAndroidDevicePolicyConfig(arg_request, arg_enterpriseId).then(
+          unittest.expectAsync1(((api.AndroidDevicePolicyConfig response) {
         checkAndroidDevicePolicyConfig(response);
       })));
     });
 
     unittest.test("method--setStoreLayout", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_request = buildStoreLayout();
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3570,18 +3702,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storeLayout"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/storeLayout"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -3594,47 +3731,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreLayout());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setStoreLayout(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.StoreLayout response) {
+      res
+          .setStoreLayout(arg_request, arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.StoreLayout response) {
         checkStoreLayout(response);
       })));
     });
 
     unittest.test("method--unenroll", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidenterpriseApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidenterpriseApi(mock).enterprises;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/unenroll", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/unenroll"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/unenroll"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3647,31 +3792,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.unenroll(arg_enterpriseId).then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-EntitlementsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EntitlementsResourceApi res = new api.AndroidenterpriseApi(mock).entitlements;
+      api.EntitlementsResourceApi res =
+          new api.AndroidenterpriseApi(mock).entitlements;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_entitlementId = "foo";
@@ -3680,25 +3824,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/entitlements/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/entitlements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/entitlements/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3714,27 +3865,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_userId, arg_entitlementId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_userId, arg_entitlementId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EntitlementsResourceApi res = new api.AndroidenterpriseApi(mock).entitlements;
+      api.EntitlementsResourceApi res =
+          new api.AndroidenterpriseApi(mock).entitlements;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_entitlementId = "foo";
@@ -3743,25 +3897,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/entitlements/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/entitlements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/entitlements/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3777,29 +3938,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntitlement());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_userId, arg_entitlementId).then(unittest.expectAsync1(((api.Entitlement response) {
+      res
+          .get(arg_enterpriseId, arg_userId, arg_entitlementId)
+          .then(unittest.expectAsync1(((api.Entitlement response) {
         checkEntitlement(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EntitlementsResourceApi res = new api.AndroidenterpriseApi(mock).entitlements;
+      api.EntitlementsResourceApi res =
+          new api.AndroidenterpriseApi(mock).entitlements;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3807,25 +3971,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/entitlements", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/entitlements"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/entitlements"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -3838,29 +4009,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntitlementsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.EntitlementsListResponse response) {
+      res
+          .list(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.EntitlementsListResponse response) {
         checkEntitlementsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EntitlementsResourceApi res = new api.AndroidenterpriseApi(mock).entitlements;
+      api.EntitlementsResourceApi res =
+          new api.AndroidenterpriseApi(mock).entitlements;
       var arg_request = buildEntitlement();
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
@@ -3874,25 +4048,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/entitlements/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/entitlements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/entitlements/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3908,30 +4089,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["install"].first, unittest.equals("$arg_install"));
-
+        unittest.expect(
+            queryMap["install"].first, unittest.equals("$arg_install"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntitlement());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_userId, arg_entitlementId, install: arg_install).then(unittest.expectAsync1(((api.Entitlement response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_userId, arg_entitlementId,
+              install: arg_install)
+          .then(unittest.expectAsync1(((api.Entitlement response) {
         checkEntitlement(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EntitlementsResourceApi res = new api.AndroidenterpriseApi(mock).entitlements;
+      api.EntitlementsResourceApi res =
+          new api.AndroidenterpriseApi(mock).entitlements;
       var arg_request = buildEntitlement();
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
@@ -3945,25 +4131,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/entitlements/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/entitlements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/entitlements/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3979,34 +4172,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["install"].first, unittest.equals("$arg_install"));
-
+        unittest.expect(
+            queryMap["install"].first, unittest.equals("$arg_install"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntitlement());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_userId, arg_entitlementId, install: arg_install).then(unittest.expectAsync1(((api.Entitlement response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_userId, arg_entitlementId,
+              install: arg_install)
+          .then(unittest.expectAsync1(((api.Entitlement response) {
         checkEntitlement(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GrouplicensesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.GrouplicensesResourceApi res = new api.AndroidenterpriseApi(mock).grouplicenses;
+      api.GrouplicensesResourceApi res =
+          new api.AndroidenterpriseApi(mock).grouplicenses;
       var arg_enterpriseId = "foo";
       var arg_groupLicenseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4014,18 +4210,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/groupLicenses/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/groupLicenses/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/groupLicenses/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4041,47 +4242,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroupLicense());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_groupLicenseId).then(unittest.expectAsync1(((api.GroupLicense response) {
+      res
+          .get(arg_enterpriseId, arg_groupLicenseId)
+          .then(unittest.expectAsync1(((api.GroupLicense response) {
         checkGroupLicense(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GrouplicensesResourceApi res = new api.AndroidenterpriseApi(mock).grouplicenses;
+      api.GrouplicensesResourceApi res =
+          new api.AndroidenterpriseApi(mock).grouplicenses;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/groupLicenses", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/groupLicenses"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/groupLicenses"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -4094,33 +4303,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroupLicensesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId).then(unittest.expectAsync1(((api.GroupLicensesListResponse response) {
+      res.list(arg_enterpriseId).then(
+          unittest.expectAsync1(((api.GroupLicensesListResponse response) {
         checkGroupLicensesListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GrouplicenseusersResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GrouplicenseusersResourceApi res = new api.AndroidenterpriseApi(mock).grouplicenseusers;
+      api.GrouplicenseusersResourceApi res =
+          new api.AndroidenterpriseApi(mock).grouplicenseusers;
       var arg_enterpriseId = "foo";
       var arg_groupLicenseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4128,25 +4337,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/groupLicenses/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/groupLicenses/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/groupLicenses/"));
         pathOffset += 15;
         index = path.indexOf("/users", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_groupLicenseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/users"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/users"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4159,31 +4375,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroupLicenseUsersListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_groupLicenseId).then(unittest.expectAsync1(((api.GroupLicenseUsersListResponse response) {
+      res.list(arg_enterpriseId, arg_groupLicenseId).then(
+          unittest.expectAsync1(((api.GroupLicenseUsersListResponse response) {
         checkGroupLicenseUsersListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-InstallsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.InstallsResourceApi res = new api.AndroidenterpriseApi(mock).installs;
       var arg_enterpriseId = "foo";
@@ -4195,32 +4410,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/installs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/installs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/installs/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4236,25 +4460,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_userId, arg_deviceId, arg_installId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_userId, arg_deviceId, arg_installId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.InstallsResourceApi res = new api.AndroidenterpriseApi(mock).installs;
       var arg_enterpriseId = "foo";
@@ -4266,32 +4492,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/installs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/installs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/installs/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4307,27 +4542,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstall());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_userId, arg_deviceId, arg_installId).then(unittest.expectAsync1(((api.Install response) {
+      res
+          .get(arg_enterpriseId, arg_userId, arg_deviceId, arg_installId)
+          .then(unittest.expectAsync1(((api.Install response) {
         checkInstall(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.InstallsResourceApi res = new api.AndroidenterpriseApi(mock).installs;
       var arg_enterpriseId = "foo";
@@ -4338,32 +4575,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/installs", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/installs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/installs"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -4376,27 +4622,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstallsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_userId, arg_deviceId).then(unittest.expectAsync1(((api.InstallsListResponse response) {
+      res
+          .list(arg_enterpriseId, arg_userId, arg_deviceId)
+          .then(unittest.expectAsync1(((api.InstallsListResponse response) {
         checkInstallsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.InstallsResourceApi res = new api.AndroidenterpriseApi(mock).installs;
       var arg_request = buildInstall();
@@ -4412,32 +4660,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/installs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/installs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/installs/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4453,27 +4710,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstall());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_userId, arg_deviceId, arg_installId).then(unittest.expectAsync1(((api.Install response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_userId, arg_deviceId,
+              arg_installId)
+          .then(unittest.expectAsync1(((api.Install response) {
         checkInstall(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.InstallsResourceApi res = new api.AndroidenterpriseApi(mock).installs;
       var arg_request = buildInstall();
@@ -4489,32 +4749,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/installs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/installs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/installs/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4530,33 +4799,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstall());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_userId, arg_deviceId, arg_installId).then(unittest.expectAsync1(((api.Install response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_userId, arg_deviceId,
+              arg_installId)
+          .then(unittest.expectAsync1(((api.Install response) {
         checkInstall(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagedconfigurationsfordeviceResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsfordeviceResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
+      api.ManagedconfigurationsfordeviceResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_deviceId = "foo";
@@ -4566,36 +4837,46 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/managedConfigurationsForDevice/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/managedConfigurationsForDevice/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("/managedConfigurationsForDevice/"));
         pathOffset += 32;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4607,27 +4888,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_userId, arg_deviceId, arg_managedConfigurationForDeviceId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_userId, arg_deviceId,
+              arg_managedConfigurationForDeviceId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsfordeviceResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
+      api.ManagedconfigurationsfordeviceResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_deviceId = "foo";
@@ -4637,36 +4922,46 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/managedConfigurationsForDevice/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/managedConfigurationsForDevice/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("/managedConfigurationsForDevice/"));
         pathOffset += 32;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4678,29 +4973,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_userId, arg_deviceId, arg_managedConfigurationForDeviceId).then(unittest.expectAsync1(((api.ManagedConfiguration response) {
+      res
+          .get(arg_enterpriseId, arg_userId, arg_deviceId,
+              arg_managedConfigurationForDeviceId)
+          .then(unittest.expectAsync1(((api.ManagedConfiguration response) {
         checkManagedConfiguration(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsfordeviceResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
+      api.ManagedconfigurationsfordeviceResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_deviceId = "foo";
@@ -4709,32 +5008,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/managedConfigurationsForDevice", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("/managedConfigurationsForDevice"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 31),
+            unittest.equals("/managedConfigurationsForDevice"));
         pathOffset += 31;
 
         var query = (req.url).query;
@@ -4747,29 +5055,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildManagedConfigurationsForDeviceListResponse());
+        var resp = convert.JSON
+            .encode(buildManagedConfigurationsForDeviceListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_userId, arg_deviceId).then(unittest.expectAsync1(((api.ManagedConfigurationsForDeviceListResponse response) {
+      res.list(arg_enterpriseId, arg_userId, arg_deviceId).then(unittest
+          .expectAsync1(
+              ((api.ManagedConfigurationsForDeviceListResponse response) {
         checkManagedConfigurationsForDeviceListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsfordeviceResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
+      api.ManagedconfigurationsfordeviceResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
       var arg_request = buildManagedConfiguration();
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
@@ -4783,36 +5095,46 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/managedConfigurationsForDevice/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/managedConfigurationsForDevice/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("/managedConfigurationsForDevice/"));
         pathOffset += 32;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4824,29 +5146,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_userId, arg_deviceId, arg_managedConfigurationForDeviceId).then(unittest.expectAsync1(((api.ManagedConfiguration response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_userId, arg_deviceId,
+              arg_managedConfigurationForDeviceId)
+          .then(unittest.expectAsync1(((api.ManagedConfiguration response) {
         checkManagedConfiguration(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsfordeviceResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
+      api.ManagedconfigurationsfordeviceResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsfordevice;
       var arg_request = buildManagedConfiguration();
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
@@ -4860,36 +5186,46 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/devices/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/devices/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/devices/"));
         pathOffset += 9;
         index = path.indexOf("/managedConfigurationsForDevice/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_deviceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/managedConfigurationsForDevice/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("/managedConfigurationsForDevice/"));
         pathOffset += 32;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForDeviceId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4901,33 +5237,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_userId, arg_deviceId, arg_managedConfigurationForDeviceId).then(unittest.expectAsync1(((api.ManagedConfiguration response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_userId, arg_deviceId,
+              arg_managedConfigurationForDeviceId)
+          .then(unittest.expectAsync1(((api.ManagedConfiguration response) {
         checkManagedConfiguration(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagedconfigurationsforuserResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsforuserResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
+      api.ManagedconfigurationsforuserResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_managedConfigurationForUserId = "foo";
@@ -4936,29 +5274,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/managedConfigurationsForUser/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/managedConfigurationsForUser/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("/managedConfigurationsForUser/"));
         pathOffset += 30;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForUserId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForUserId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4970,27 +5316,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(
+              arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsforuserResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
+      api.ManagedconfigurationsforuserResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       var arg_managedConfigurationForUserId = "foo";
@@ -4999,29 +5349,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/managedConfigurationsForUser/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/managedConfigurationsForUser/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("/managedConfigurationsForUser/"));
         pathOffset += 30;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForUserId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForUserId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5033,29 +5391,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId).then(unittest.expectAsync1(((api.ManagedConfiguration response) {
+      res
+          .get(arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId)
+          .then(unittest.expectAsync1(((api.ManagedConfiguration response) {
         checkManagedConfiguration(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsforuserResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
+      api.ManagedconfigurationsforuserResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5063,25 +5424,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/managedConfigurationsForUser", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 29), unittest.equals("/managedConfigurationsForUser"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 29),
+            unittest.equals("/managedConfigurationsForUser"));
         pathOffset += 29;
 
         var query = (req.url).query;
@@ -5094,29 +5462,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildManagedConfigurationsForUserListResponse());
+        var resp = convert.JSON
+            .encode(buildManagedConfigurationsForUserListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.ManagedConfigurationsForUserListResponse response) {
+      res.list(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(
+          ((api.ManagedConfigurationsForUserListResponse response) {
         checkManagedConfigurationsForUserListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsforuserResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
+      api.ManagedconfigurationsforuserResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
       var arg_request = buildManagedConfiguration();
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
@@ -5129,29 +5500,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/managedConfigurationsForUser/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/managedConfigurationsForUser/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("/managedConfigurationsForUser/"));
         pathOffset += 30;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForUserId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForUserId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5163,29 +5542,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId).then(unittest.expectAsync1(((api.ManagedConfiguration response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_userId,
+              arg_managedConfigurationForUserId)
+          .then(unittest.expectAsync1(((api.ManagedConfiguration response) {
         checkManagedConfiguration(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ManagedconfigurationsforuserResourceApi res = new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
+      api.ManagedconfigurationsforuserResourceApi res =
+          new api.AndroidenterpriseApi(mock).managedconfigurationsforuser;
       var arg_request = buildManagedConfiguration();
       var arg_enterpriseId = "foo";
       var arg_userId = "foo";
@@ -5198,29 +5581,37 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/managedConfigurationsForUser/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/managedConfigurationsForUser/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("/managedConfigurationsForUser/"));
         pathOffset += 30;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedConfigurationForUserId"));
+        unittest.expect(
+            subPart, unittest.equals("$arg_managedConfigurationForUserId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5232,33 +5623,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId).then(unittest.expectAsync1(((api.ManagedConfiguration response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_userId,
+              arg_managedConfigurationForUserId)
+          .then(unittest.expectAsync1(((api.ManagedConfiguration response) {
         checkManagedConfiguration(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PermissionsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.PermissionsResourceApi res = new api.AndroidenterpriseApi(mock).permissions;
+      api.PermissionsResourceApi res =
+          new api.AndroidenterpriseApi(mock).permissions;
       var arg_permissionId = "foo";
       var arg_language = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5266,11 +5659,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("permissions/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5286,32 +5682,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_permissionId, language: arg_language).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .get(arg_permissionId, language: arg_language)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProductsResourceApi", () {
     unittest.test("method--approve", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_request = buildProductsApproveRequest();
@@ -5325,25 +5722,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/products/"));
         pathOffset += 10;
         index = path.indexOf("/approve", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/approve"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/approve"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5356,25 +5760,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.approve(arg_request, arg_enterpriseId, arg_productId).then(unittest.expectAsync1((_) {}));
+      res
+          .approve(arg_request, arg_enterpriseId, arg_productId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--generateApprovalUrl", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_enterpriseId = "foo";
@@ -5385,25 +5791,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/products/"));
         pathOffset += 10;
         index = path.indexOf("/generateApprovalUrl", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/generateApprovalUrl"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/generateApprovalUrl"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -5416,28 +5829,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["languageCode"].first, unittest.equals(arg_languageCode));
-
+        unittest.expect(
+            queryMap["languageCode"].first, unittest.equals(arg_languageCode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildProductsGenerateApprovalUrlResponse());
+        var resp =
+            convert.JSON.encode(buildProductsGenerateApprovalUrlResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateApprovalUrl(arg_enterpriseId, arg_productId, languageCode: arg_languageCode).then(unittest.expectAsync1(((api.ProductsGenerateApprovalUrlResponse response) {
+      res
+          .generateApprovalUrl(arg_enterpriseId, arg_productId,
+              languageCode: arg_languageCode)
+          .then(unittest.expectAsync1(
+              ((api.ProductsGenerateApprovalUrlResponse response) {
         checkProductsGenerateApprovalUrlResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_enterpriseId = "foo";
@@ -5448,18 +5867,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/products/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5475,28 +5899,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_productId, language: arg_language).then(unittest.expectAsync1(((api.Product response) {
+      res
+          .get(arg_enterpriseId, arg_productId, language: arg_language)
+          .then(unittest.expectAsync1(((api.Product response) {
         checkProduct(response);
       })));
     });
 
     unittest.test("method--getAppRestrictionsSchema", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_enterpriseId = "foo";
@@ -5507,25 +5934,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/products/"));
         pathOffset += 10;
         index = path.indexOf("/appRestrictionsSchema", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/appRestrictionsSchema"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/appRestrictionsSchema"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -5538,28 +5972,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppRestrictionsSchema());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getAppRestrictionsSchema(arg_enterpriseId, arg_productId, language: arg_language).then(unittest.expectAsync1(((api.AppRestrictionsSchema response) {
+      res
+          .getAppRestrictionsSchema(arg_enterpriseId, arg_productId,
+              language: arg_language)
+          .then(unittest.expectAsync1(((api.AppRestrictionsSchema response) {
         checkAppRestrictionsSchema(response);
       })));
     });
 
     unittest.test("method--getPermissions", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_enterpriseId = "foo";
@@ -5569,25 +6007,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/products/"));
         pathOffset += 10;
         index = path.indexOf("/permissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/permissions"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -5600,27 +6045,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProductPermissions());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getPermissions(arg_enterpriseId, arg_productId).then(unittest.expectAsync1(((api.ProductPermissions response) {
+      res
+          .getPermissions(arg_enterpriseId, arg_productId)
+          .then(unittest.expectAsync1(((api.ProductPermissions response) {
         checkProductPermissions(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_enterpriseId = "foo";
@@ -5634,18 +6081,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/products"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/products"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5658,32 +6110,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["approved"].first, unittest.equals("$arg_approved"));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["approved"].first, unittest.equals("$arg_approved"));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProductsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, approved: arg_approved, language: arg_language, maxResults: arg_maxResults, query: arg_query, token: arg_token).then(unittest.expectAsync1(((api.ProductsListResponse response) {
+      res
+          .list(arg_enterpriseId,
+              approved: arg_approved,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              query: arg_query,
+              token: arg_token)
+          .then(unittest.expectAsync1(((api.ProductsListResponse response) {
         checkProductsListResponse(response);
       })));
     });
 
     unittest.test("method--unapprove", () {
-
       var mock = new HttpServerMock();
       api.ProductsResourceApi res = new api.AndroidenterpriseApi(mock).products;
       var arg_enterpriseId = "foo";
@@ -5693,25 +6155,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/products/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/products/"));
         pathOffset += 10;
         index = path.indexOf("/unapprove", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/unapprove"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/unapprove"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -5724,31 +6193,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unapprove(arg_enterpriseId, arg_productId).then(unittest.expectAsync1((_) {}));
+      res
+          .unapprove(arg_enterpriseId, arg_productId)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-ServiceaccountkeysResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ServiceaccountkeysResourceApi res = new api.AndroidenterpriseApi(mock).serviceaccountkeys;
+      api.ServiceaccountkeysResourceApi res =
+          new api.AndroidenterpriseApi(mock).serviceaccountkeys;
       var arg_enterpriseId = "foo";
       var arg_keyId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5756,18 +6226,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/serviceAccountKeys/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/serviceAccountKeys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/serviceAccountKeys/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5783,27 +6258,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_keyId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_keyId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ServiceaccountkeysResourceApi res = new api.AndroidenterpriseApi(mock).serviceaccountkeys;
+      api.ServiceaccountkeysResourceApi res =
+          new api.AndroidenterpriseApi(mock).serviceaccountkeys;
       var arg_request = buildServiceAccountKey();
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5814,18 +6292,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/serviceAccountKeys", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/serviceAccountKeys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/serviceAccountKeys"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -5838,47 +6321,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildServiceAccountKey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.ServiceAccountKey response) {
+      res
+          .insert(arg_request, arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.ServiceAccountKey response) {
         checkServiceAccountKey(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ServiceaccountkeysResourceApi res = new api.AndroidenterpriseApi(mock).serviceaccountkeys;
+      api.ServiceaccountkeysResourceApi res =
+          new api.AndroidenterpriseApi(mock).serviceaccountkeys;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/serviceAccountKeys", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/serviceAccountKeys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/serviceAccountKeys"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -5891,33 +6382,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildServiceAccountKeysListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId).then(unittest.expectAsync1(((api.ServiceAccountKeysListResponse response) {
+      res.list(arg_enterpriseId).then(
+          unittest.expectAsync1(((api.ServiceAccountKeysListResponse response) {
         checkServiceAccountKeysListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-StorelayoutclustersResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutclustersResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutclusters;
+      api.StorelayoutclustersResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutclusters;
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
       var arg_clusterId = "foo";
@@ -5926,25 +6417,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5960,27 +6458,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_pageId, arg_clusterId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_pageId, arg_clusterId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutclustersResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutclusters;
+      api.StorelayoutclustersResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutclusters;
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
       var arg_clusterId = "foo";
@@ -5989,25 +6490,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6023,29 +6531,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreCluster());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_pageId, arg_clusterId).then(unittest.expectAsync1(((api.StoreCluster response) {
+      res
+          .get(arg_enterpriseId, arg_pageId, arg_clusterId)
+          .then(unittest.expectAsync1(((api.StoreCluster response) {
         checkStoreCluster(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutclustersResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutclusters;
+      api.StorelayoutclustersResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutclusters;
       var arg_request = buildStoreCluster();
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
@@ -6057,25 +6568,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         index = path.indexOf("/clusters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/clusters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/clusters"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -6088,29 +6606,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreCluster());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_enterpriseId, arg_pageId).then(unittest.expectAsync1(((api.StoreCluster response) {
+      res
+          .insert(arg_request, arg_enterpriseId, arg_pageId)
+          .then(unittest.expectAsync1(((api.StoreCluster response) {
         checkStoreCluster(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutclustersResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutclusters;
+      api.StorelayoutclustersResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutclusters;
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6118,25 +6639,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         index = path.indexOf("/clusters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/clusters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/clusters"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -6149,29 +6677,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreLayoutClustersListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_pageId).then(unittest.expectAsync1(((api.StoreLayoutClustersListResponse response) {
+      res.list(arg_enterpriseId, arg_pageId).then(unittest
+          .expectAsync1(((api.StoreLayoutClustersListResponse response) {
         checkStoreLayoutClustersListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutclustersResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutclusters;
+      api.StorelayoutclustersResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutclusters;
       var arg_request = buildStoreCluster();
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
@@ -6184,25 +6714,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6218,29 +6755,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreCluster());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_pageId, arg_clusterId).then(unittest.expectAsync1(((api.StoreCluster response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_pageId, arg_clusterId)
+          .then(unittest.expectAsync1(((api.StoreCluster response) {
         checkStoreCluster(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutclustersResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutclusters;
+      api.StorelayoutclustersResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutclusters;
       var arg_request = buildStoreCluster();
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
@@ -6253,25 +6793,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6287,33 +6834,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreCluster());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_pageId, arg_clusterId).then(unittest.expectAsync1(((api.StoreCluster response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_pageId, arg_clusterId)
+          .then(unittest.expectAsync1(((api.StoreCluster response) {
         checkStoreCluster(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-StorelayoutpagesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutpagesResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutpages;
+      api.StorelayoutpagesResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutpages;
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6321,18 +6869,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6348,27 +6901,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_pageId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_pageId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutpagesResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutpages;
+      api.StorelayoutpagesResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutpages;
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6376,18 +6932,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6403,29 +6964,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStorePage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_pageId).then(unittest.expectAsync1(((api.StorePage response) {
+      res
+          .get(arg_enterpriseId, arg_pageId)
+          .then(unittest.expectAsync1(((api.StorePage response) {
         checkStorePage(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutpagesResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutpages;
+      api.StorelayoutpagesResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutpages;
       var arg_request = buildStorePage();
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6436,18 +7000,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/storeLayout/pages"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/storeLayout/pages"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -6460,47 +7029,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStorePage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.StorePage response) {
+      res
+          .insert(arg_request, arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.StorePage response) {
         checkStorePage(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutpagesResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutpages;
+      api.StorelayoutpagesResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutpages;
       var arg_enterpriseId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/storeLayout/pages"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/storeLayout/pages"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -6513,29 +7090,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStoreLayoutPagesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId).then(unittest.expectAsync1(((api.StoreLayoutPagesListResponse response) {
+      res.list(arg_enterpriseId).then(
+          unittest.expectAsync1(((api.StoreLayoutPagesListResponse response) {
         checkStoreLayoutPagesListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutpagesResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutpages;
+      api.StorelayoutpagesResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutpages;
       var arg_request = buildStorePage();
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
@@ -6547,18 +7126,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6574,29 +7158,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStorePage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_pageId).then(unittest.expectAsync1(((api.StorePage response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_pageId)
+          .then(unittest.expectAsync1(((api.StorePage response) {
         checkStorePage(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.StorelayoutpagesResourceApi res = new api.AndroidenterpriseApi(mock).storelayoutpages;
+      api.StorelayoutpagesResourceApi res =
+          new api.AndroidenterpriseApi(mock).storelayoutpages;
       var arg_request = buildStorePage();
       var arg_enterpriseId = "foo";
       var arg_pageId = "foo";
@@ -6608,18 +7195,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/storeLayout/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/storeLayout/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/storeLayout/pages/"));
         pathOffset += 19;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6635,31 +7227,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStorePage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_pageId).then(unittest.expectAsync1(((api.StorePage response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_pageId)
+          .then(unittest.expectAsync1(((api.StorePage response) {
         checkStorePage(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UsersResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -6669,18 +7261,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6696,25 +7293,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_enterpriseId, arg_userId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--generateAuthenticationToken", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -6724,25 +7323,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/authenticationToken", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/authenticationToken"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/authenticationToken"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -6755,27 +7361,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAuthenticationToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateAuthenticationToken(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.AuthenticationToken response) {
+      res
+          .generateAuthenticationToken(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.AuthenticationToken response) {
         checkAuthenticationToken(response);
       })));
     });
 
     unittest.test("method--generateToken", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -6785,25 +7393,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/token", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/token"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/token"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -6816,27 +7431,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUserToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateToken(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.UserToken response) {
+      res
+          .generateToken(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.UserToken response) {
         checkUserToken(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -6846,18 +7463,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6873,27 +7495,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.User response) {
+      res
+          .get(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
 
     unittest.test("method--getAvailableProductSet", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -6903,25 +7527,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/availableProductSet", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/availableProductSet"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/availableProductSet"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -6934,27 +7565,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProductSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getAvailableProductSet(arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.ProductSet response) {
+      res
+          .getAvailableProductSet(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.ProductSet response) {
         checkProductSet(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_request = buildUser();
@@ -6967,18 +7600,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/users"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/users"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -6991,27 +7629,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_enterpriseId).then(unittest.expectAsync1(((api.User response) {
+      res
+          .insert(arg_request, arg_enterpriseId)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -7021,18 +7661,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/users"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/users"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -7045,28 +7690,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["email"].first, unittest.equals(arg_email));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUsersListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_enterpriseId, arg_email).then(unittest.expectAsync1(((api.UsersListResponse response) {
+      res
+          .list(arg_enterpriseId, arg_email)
+          .then(unittest.expectAsync1(((api.UsersListResponse response) {
         checkUsersListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_request = buildUser();
@@ -7080,18 +7727,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7107,27 +7759,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.User response) {
+      res
+          .patch(arg_request, arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
 
     unittest.test("method--revokeToken", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_enterpriseId = "foo";
@@ -7137,25 +7791,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/token", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/token"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/token"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -7168,25 +7829,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.revokeToken(arg_enterpriseId, arg_userId).then(unittest.expectAsync1((_) {}));
+      res
+          .revokeToken(arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--setAvailableProductSet", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_request = buildProductSet();
@@ -7200,25 +7863,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         index = path.indexOf("/availableProductSet", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/availableProductSet"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("/availableProductSet"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -7231,27 +7901,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProductSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setAvailableProductSet(arg_request, arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.ProductSet response) {
+      res
+          .setAvailableProductSet(arg_request, arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.ProductSet response) {
         checkProductSet(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.UsersResourceApi res = new api.AndroidenterpriseApi(mock).users;
       var arg_request = buildUser();
@@ -7265,18 +7937,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("androidenterprise/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("androidenterprise/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("enterprises/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("enterprises/"));
         pathOffset += 12;
         index = path.indexOf("/users/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_enterpriseId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/users/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/users/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7292,27 +7969,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_enterpriseId, arg_userId).then(unittest.expectAsync1(((api.User response) {
+      res
+          .update(arg_request, arg_enterpriseId, arg_userId)
+          .then(unittest.expectAsync1(((api.User response) {
         checkUser(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/androidmanagement/v1_test.dart b/generated/googleapis/test/androidmanagement/v1_test.dart
index 8cee3f2..3b032bb 100644
--- a/generated/googleapis/test/androidmanagement/v1_test.dart
+++ b/generated/googleapis/test/androidmanagement/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.androidmanagement.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/androidmanagement/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -70,27 +69,27 @@
   buildCounterApiLevelCondition--;
 }
 
-buildUnnamed1559() {
+buildUnnamed1554() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed1559(core.List<api.ManagedProperty> o) {
+checkUnnamed1554(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
 }
 
-buildUnnamed1560() {
+buildUnnamed1555() {
   var o = new core.List<api.ApplicationPermission>();
   o.add(buildApplicationPermission());
   o.add(buildApplicationPermission());
   return o;
 }
 
-checkUnnamed1560(core.List<api.ApplicationPermission> o) {
+checkUnnamed1555(core.List<api.ApplicationPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationPermission(o[0]);
   checkApplicationPermission(o[1]);
@@ -101,9 +100,9 @@
   var o = new api.Application();
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
-    o.managedProperties = buildUnnamed1559();
+    o.managedProperties = buildUnnamed1554();
     o.name = "foo";
-    o.permissions = buildUnnamed1560();
+    o.permissions = buildUnnamed1555();
     o.title = "foo";
   }
   buildCounterApplication--;
@@ -113,9 +112,9 @@
 checkApplication(api.Application o) {
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
-    checkUnnamed1559(o.managedProperties);
+    checkUnnamed1554(o.managedProperties);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1560(o.permissions);
+    checkUnnamed1555(o.permissions);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterApplication--;
@@ -144,27 +143,43 @@
   buildCounterApplicationPermission--;
 }
 
-buildUnnamed1561() {
+buildUnnamed1556() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1561(core.Map<core.String, core.Object> o) {
+checkUnnamed1556(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1562() {
+buildUnnamed1557() {
   var o = new core.List<api.PermissionGrant>();
   o.add(buildPermissionGrant());
   o.add(buildPermissionGrant());
   return o;
 }
 
-checkUnnamed1562(core.List<api.PermissionGrant> o) {
+checkUnnamed1557(core.List<api.PermissionGrant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionGrant(o[0]);
   checkPermissionGrant(o[1]);
@@ -178,9 +193,9 @@
     o.defaultPermissionPolicy = "foo";
     o.installType = "foo";
     o.lockTaskAllowed = true;
-    o.managedConfiguration = buildUnnamed1561();
+    o.managedConfiguration = buildUnnamed1556();
     o.packageName = "foo";
-    o.permissionGrants = buildUnnamed1562();
+    o.permissionGrants = buildUnnamed1557();
   }
   buildCounterApplicationPolicy--;
   return o;
@@ -192,21 +207,21 @@
     unittest.expect(o.defaultPermissionPolicy, unittest.equals('foo'));
     unittest.expect(o.installType, unittest.equals('foo'));
     unittest.expect(o.lockTaskAllowed, unittest.isTrue);
-    checkUnnamed1561(o.managedConfiguration);
+    checkUnnamed1556(o.managedConfiguration);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed1562(o.permissionGrants);
+    checkUnnamed1557(o.permissionGrants);
   }
   buildCounterApplicationPolicy--;
 }
 
-buildUnnamed1563() {
+buildUnnamed1558() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1563(core.List<core.String> o) {
+checkUnnamed1558(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -220,7 +235,7 @@
     o.createTime = "foo";
     o.duration = "foo";
     o.newPassword = "foo";
-    o.resetPasswordFlags = buildUnnamed1563();
+    o.resetPasswordFlags = buildUnnamed1558();
     o.type = "foo";
   }
   buildCounterCommand--;
@@ -233,7 +248,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.newPassword, unittest.equals('foo'));
-    checkUnnamed1563(o.resetPasswordFlags);
+    checkUnnamed1558(o.resetPasswordFlags);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCommand--;
@@ -262,79 +277,79 @@
   buildCounterComplianceRule--;
 }
 
-buildUnnamed1564() {
+buildUnnamed1559() {
   var o = new core.List<api.Display>();
   o.add(buildDisplay());
   o.add(buildDisplay());
   return o;
 }
 
-checkUnnamed1564(core.List<api.Display> o) {
+checkUnnamed1559(core.List<api.Display> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisplay(o[0]);
   checkDisplay(o[1]);
 }
 
-buildUnnamed1565() {
+buildUnnamed1560() {
   var o = new core.List<api.HardwareStatus>();
   o.add(buildHardwareStatus());
   o.add(buildHardwareStatus());
   return o;
 }
 
-checkUnnamed1565(core.List<api.HardwareStatus> o) {
+checkUnnamed1560(core.List<api.HardwareStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHardwareStatus(o[0]);
   checkHardwareStatus(o[1]);
 }
 
-buildUnnamed1566() {
+buildUnnamed1561() {
   var o = new core.List<api.MemoryEvent>();
   o.add(buildMemoryEvent());
   o.add(buildMemoryEvent());
   return o;
 }
 
-checkUnnamed1566(core.List<api.MemoryEvent> o) {
+checkUnnamed1561(core.List<api.MemoryEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMemoryEvent(o[0]);
   checkMemoryEvent(o[1]);
 }
 
-buildUnnamed1567() {
+buildUnnamed1562() {
   var o = new core.List<api.NonComplianceDetail>();
   o.add(buildNonComplianceDetail());
   o.add(buildNonComplianceDetail());
   return o;
 }
 
-checkUnnamed1567(core.List<api.NonComplianceDetail> o) {
+checkUnnamed1562(core.List<api.NonComplianceDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNonComplianceDetail(o[0]);
   checkNonComplianceDetail(o[1]);
 }
 
-buildUnnamed1568() {
+buildUnnamed1563() {
   var o = new core.List<api.PowerManagementEvent>();
   o.add(buildPowerManagementEvent());
   o.add(buildPowerManagementEvent());
   return o;
 }
 
-checkUnnamed1568(core.List<api.PowerManagementEvent> o) {
+checkUnnamed1563(core.List<api.PowerManagementEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPowerManagementEvent(o[0]);
   checkPowerManagementEvent(o[1]);
 }
 
-buildUnnamed1569() {
+buildUnnamed1564() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1569(core.List<core.String> o) {
+checkUnnamed1564(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -350,24 +365,24 @@
     o.appliedPolicyVersion = "foo";
     o.appliedState = "foo";
     o.disabledReason = buildUserFacingMessage();
-    o.displays = buildUnnamed1564();
+    o.displays = buildUnnamed1559();
     o.enrollmentTime = "foo";
     o.enrollmentTokenData = "foo";
     o.enrollmentTokenName = "foo";
     o.hardwareInfo = buildHardwareInfo();
-    o.hardwareStatusSamples = buildUnnamed1565();
+    o.hardwareStatusSamples = buildUnnamed1560();
     o.lastPolicyComplianceReportTime = "foo";
     o.lastPolicySyncTime = "foo";
     o.lastStatusReportTime = "foo";
-    o.memoryEvents = buildUnnamed1566();
+    o.memoryEvents = buildUnnamed1561();
     o.memoryInfo = buildMemoryInfo();
     o.name = "foo";
     o.networkInfo = buildNetworkInfo();
-    o.nonComplianceDetails = buildUnnamed1567();
+    o.nonComplianceDetails = buildUnnamed1562();
     o.policyCompliant = true;
     o.policyName = "foo";
-    o.powerManagementEvents = buildUnnamed1568();
-    o.previousDeviceNames = buildUnnamed1569();
+    o.powerManagementEvents = buildUnnamed1563();
+    o.previousDeviceNames = buildUnnamed1564();
     o.softwareInfo = buildSoftwareInfo();
     o.state = "foo";
     o.userName = "foo";
@@ -384,24 +399,24 @@
     unittest.expect(o.appliedPolicyVersion, unittest.equals('foo'));
     unittest.expect(o.appliedState, unittest.equals('foo'));
     checkUserFacingMessage(o.disabledReason);
-    checkUnnamed1564(o.displays);
+    checkUnnamed1559(o.displays);
     unittest.expect(o.enrollmentTime, unittest.equals('foo'));
     unittest.expect(o.enrollmentTokenData, unittest.equals('foo'));
     unittest.expect(o.enrollmentTokenName, unittest.equals('foo'));
     checkHardwareInfo(o.hardwareInfo);
-    checkUnnamed1565(o.hardwareStatusSamples);
+    checkUnnamed1560(o.hardwareStatusSamples);
     unittest.expect(o.lastPolicyComplianceReportTime, unittest.equals('foo'));
     unittest.expect(o.lastPolicySyncTime, unittest.equals('foo'));
     unittest.expect(o.lastStatusReportTime, unittest.equals('foo'));
-    checkUnnamed1566(o.memoryEvents);
+    checkUnnamed1561(o.memoryEvents);
     checkMemoryInfo(o.memoryInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     checkNetworkInfo(o.networkInfo);
-    checkUnnamed1567(o.nonComplianceDetails);
+    checkUnnamed1562(o.nonComplianceDetails);
     unittest.expect(o.policyCompliant, unittest.isTrue);
     unittest.expect(o.policyName, unittest.equals('foo'));
-    checkUnnamed1568(o.powerManagementEvents);
-    checkUnnamed1569(o.previousDeviceNames);
+    checkUnnamed1563(o.powerManagementEvents);
+    checkUnnamed1564(o.previousDeviceNames);
     checkSoftwareInfo(o.softwareInfo);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.userName, unittest.equals('foo'));
@@ -444,16 +459,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -488,14 +501,14 @@
   buildCounterEnrollmentToken--;
 }
 
-buildUnnamed1570() {
+buildUnnamed1565() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1570(core.List<core.String> o) {
+checkUnnamed1565(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -507,7 +520,7 @@
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
     o.appAutoApprovalEnabled = true;
-    o.enabledNotificationTypes = buildUnnamed1570();
+    o.enabledNotificationTypes = buildUnnamed1565();
     o.enterpriseDisplayName = "foo";
     o.logo = buildExternalData();
     o.name = "foo";
@@ -522,7 +535,7 @@
   buildCounterEnterprise++;
   if (buildCounterEnterprise < 3) {
     unittest.expect(o.appAutoApprovalEnabled, unittest.isTrue);
-    checkUnnamed1570(o.enabledNotificationTypes);
+    checkUnnamed1565(o.enabledNotificationTypes);
     unittest.expect(o.enterpriseDisplayName, unittest.equals('foo'));
     checkExternalData(o.logo);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -553,6 +566,71 @@
   buildCounterExternalData--;
 }
 
+buildUnnamed1566() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed1566(core.List<core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals(42.0));
+  unittest.expect(o[1], unittest.equals(42.0));
+}
+
+buildUnnamed1567() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed1567(core.List<core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals(42.0));
+  unittest.expect(o[1], unittest.equals(42.0));
+}
+
+buildUnnamed1568() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed1568(core.List<core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals(42.0));
+  unittest.expect(o[1], unittest.equals(42.0));
+}
+
+buildUnnamed1569() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed1569(core.List<core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals(42.0));
+  unittest.expect(o[1], unittest.equals(42.0));
+}
+
+buildUnnamed1570() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed1570(core.List<core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals(42.0));
+  unittest.expect(o[1], unittest.equals(42.0));
+}
+
 buildUnnamed1571() {
   var o = new core.List<core.double>();
   o.add(42.0);
@@ -592,6 +670,51 @@
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
+core.int buildCounterHardwareInfo = 0;
+buildHardwareInfo() {
+  var o = new api.HardwareInfo();
+  buildCounterHardwareInfo++;
+  if (buildCounterHardwareInfo < 3) {
+    o.batteryShutdownTemperatures = buildUnnamed1566();
+    o.batteryThrottlingTemperatures = buildUnnamed1567();
+    o.brand = "foo";
+    o.cpuShutdownTemperatures = buildUnnamed1568();
+    o.cpuThrottlingTemperatures = buildUnnamed1569();
+    o.deviceBasebandVersion = "foo";
+    o.gpuShutdownTemperatures = buildUnnamed1570();
+    o.gpuThrottlingTemperatures = buildUnnamed1571();
+    o.hardware = "foo";
+    o.manufacturer = "foo";
+    o.model = "foo";
+    o.serialNumber = "foo";
+    o.skinShutdownTemperatures = buildUnnamed1572();
+    o.skinThrottlingTemperatures = buildUnnamed1573();
+  }
+  buildCounterHardwareInfo--;
+  return o;
+}
+
+checkHardwareInfo(api.HardwareInfo o) {
+  buildCounterHardwareInfo++;
+  if (buildCounterHardwareInfo < 3) {
+    checkUnnamed1566(o.batteryShutdownTemperatures);
+    checkUnnamed1567(o.batteryThrottlingTemperatures);
+    unittest.expect(o.brand, unittest.equals('foo'));
+    checkUnnamed1568(o.cpuShutdownTemperatures);
+    checkUnnamed1569(o.cpuThrottlingTemperatures);
+    unittest.expect(o.deviceBasebandVersion, unittest.equals('foo'));
+    checkUnnamed1570(o.gpuShutdownTemperatures);
+    checkUnnamed1571(o.gpuThrottlingTemperatures);
+    unittest.expect(o.hardware, unittest.equals('foo'));
+    unittest.expect(o.manufacturer, unittest.equals('foo'));
+    unittest.expect(o.model, unittest.equals('foo'));
+    unittest.expect(o.serialNumber, unittest.equals('foo'));
+    checkUnnamed1572(o.skinShutdownTemperatures);
+    checkUnnamed1573(o.skinThrottlingTemperatures);
+  }
+  buildCounterHardwareInfo--;
+}
+
 buildUnnamed1574() {
   var o = new core.List<core.double>();
   o.add(42.0);
@@ -657,51 +780,6 @@
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-core.int buildCounterHardwareInfo = 0;
-buildHardwareInfo() {
-  var o = new api.HardwareInfo();
-  buildCounterHardwareInfo++;
-  if (buildCounterHardwareInfo < 3) {
-    o.batteryShutdownTemperatures = buildUnnamed1571();
-    o.batteryThrottlingTemperatures = buildUnnamed1572();
-    o.brand = "foo";
-    o.cpuShutdownTemperatures = buildUnnamed1573();
-    o.cpuThrottlingTemperatures = buildUnnamed1574();
-    o.deviceBasebandVersion = "foo";
-    o.gpuShutdownTemperatures = buildUnnamed1575();
-    o.gpuThrottlingTemperatures = buildUnnamed1576();
-    o.hardware = "foo";
-    o.manufacturer = "foo";
-    o.model = "foo";
-    o.serialNumber = "foo";
-    o.skinShutdownTemperatures = buildUnnamed1577();
-    o.skinThrottlingTemperatures = buildUnnamed1578();
-  }
-  buildCounterHardwareInfo--;
-  return o;
-}
-
-checkHardwareInfo(api.HardwareInfo o) {
-  buildCounterHardwareInfo++;
-  if (buildCounterHardwareInfo < 3) {
-    checkUnnamed1571(o.batteryShutdownTemperatures);
-    checkUnnamed1572(o.batteryThrottlingTemperatures);
-    unittest.expect(o.brand, unittest.equals('foo'));
-    checkUnnamed1573(o.cpuShutdownTemperatures);
-    checkUnnamed1574(o.cpuThrottlingTemperatures);
-    unittest.expect(o.deviceBasebandVersion, unittest.equals('foo'));
-    checkUnnamed1575(o.gpuShutdownTemperatures);
-    checkUnnamed1576(o.gpuThrottlingTemperatures);
-    unittest.expect(o.hardware, unittest.equals('foo'));
-    unittest.expect(o.manufacturer, unittest.equals('foo'));
-    unittest.expect(o.model, unittest.equals('foo'));
-    unittest.expect(o.serialNumber, unittest.equals('foo'));
-    checkUnnamed1577(o.skinShutdownTemperatures);
-    checkUnnamed1578(o.skinThrottlingTemperatures);
-  }
-  buildCounterHardwareInfo--;
-}
-
 buildUnnamed1579() {
   var o = new core.List<core.double>();
   o.add(42.0);
@@ -715,83 +793,18 @@
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1580() {
-  var o = new core.List<core.double>();
-  o.add(42.0);
-  o.add(42.0);
-  return o;
-}
-
-checkUnnamed1580(core.List<core.double> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals(42.0));
-  unittest.expect(o[1], unittest.equals(42.0));
-}
-
-buildUnnamed1581() {
-  var o = new core.List<core.double>();
-  o.add(42.0);
-  o.add(42.0);
-  return o;
-}
-
-checkUnnamed1581(core.List<core.double> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals(42.0));
-  unittest.expect(o[1], unittest.equals(42.0));
-}
-
-buildUnnamed1582() {
-  var o = new core.List<core.double>();
-  o.add(42.0);
-  o.add(42.0);
-  return o;
-}
-
-checkUnnamed1582(core.List<core.double> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals(42.0));
-  unittest.expect(o[1], unittest.equals(42.0));
-}
-
-buildUnnamed1583() {
-  var o = new core.List<core.double>();
-  o.add(42.0);
-  o.add(42.0);
-  return o;
-}
-
-checkUnnamed1583(core.List<core.double> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals(42.0));
-  unittest.expect(o[1], unittest.equals(42.0));
-}
-
-buildUnnamed1584() {
-  var o = new core.List<core.double>();
-  o.add(42.0);
-  o.add(42.0);
-  return o;
-}
-
-checkUnnamed1584(core.List<core.double> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals(42.0));
-  unittest.expect(o[1], unittest.equals(42.0));
-}
-
 core.int buildCounterHardwareStatus = 0;
 buildHardwareStatus() {
   var o = new api.HardwareStatus();
   buildCounterHardwareStatus++;
   if (buildCounterHardwareStatus < 3) {
-    o.batteryTemperatures = buildUnnamed1579();
-    o.cpuTemperatures = buildUnnamed1580();
-    o.cpuUsages = buildUnnamed1581();
+    o.batteryTemperatures = buildUnnamed1574();
+    o.cpuTemperatures = buildUnnamed1575();
+    o.cpuUsages = buildUnnamed1576();
     o.createTime = "foo";
-    o.fanSpeeds = buildUnnamed1582();
-    o.gpuTemperatures = buildUnnamed1583();
-    o.skinTemperatures = buildUnnamed1584();
+    o.fanSpeeds = buildUnnamed1577();
+    o.gpuTemperatures = buildUnnamed1578();
+    o.skinTemperatures = buildUnnamed1579();
   }
   buildCounterHardwareStatus--;
   return o;
@@ -800,25 +813,25 @@
 checkHardwareStatus(api.HardwareStatus o) {
   buildCounterHardwareStatus++;
   if (buildCounterHardwareStatus < 3) {
-    checkUnnamed1579(o.batteryTemperatures);
-    checkUnnamed1580(o.cpuTemperatures);
-    checkUnnamed1581(o.cpuUsages);
+    checkUnnamed1574(o.batteryTemperatures);
+    checkUnnamed1575(o.cpuTemperatures);
+    checkUnnamed1576(o.cpuUsages);
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed1582(o.fanSpeeds);
-    checkUnnamed1583(o.gpuTemperatures);
-    checkUnnamed1584(o.skinTemperatures);
+    checkUnnamed1577(o.fanSpeeds);
+    checkUnnamed1578(o.gpuTemperatures);
+    checkUnnamed1579(o.skinTemperatures);
   }
   buildCounterHardwareStatus--;
 }
 
-buildUnnamed1585() {
+buildUnnamed1580() {
   var o = new core.List<api.Device>();
   o.add(buildDevice());
   o.add(buildDevice());
   return o;
 }
 
-checkUnnamed1585(core.List<api.Device> o) {
+checkUnnamed1580(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDevice(o[0]);
   checkDevice(o[1]);
@@ -829,7 +842,7 @@
   var o = new api.ListDevicesResponse();
   buildCounterListDevicesResponse++;
   if (buildCounterListDevicesResponse < 3) {
-    o.devices = buildUnnamed1585();
+    o.devices = buildUnnamed1580();
     o.nextPageToken = "foo";
   }
   buildCounterListDevicesResponse--;
@@ -839,20 +852,20 @@
 checkListDevicesResponse(api.ListDevicesResponse o) {
   buildCounterListDevicesResponse++;
   if (buildCounterListDevicesResponse < 3) {
-    checkUnnamed1585(o.devices);
+    checkUnnamed1580(o.devices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDevicesResponse--;
 }
 
-buildUnnamed1586() {
+buildUnnamed1581() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1586(core.List<api.Operation> o) {
+checkUnnamed1581(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -864,7 +877,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1586();
+    o.operations = buildUnnamed1581();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -874,19 +887,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1586(o.operations);
+    checkUnnamed1581(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1587() {
+buildUnnamed1582() {
   var o = new core.List<api.Policy>();
   o.add(buildPolicy());
   o.add(buildPolicy());
   return o;
 }
 
-checkUnnamed1587(core.List<api.Policy> o) {
+checkUnnamed1582(core.List<api.Policy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPolicy(o[0]);
   checkPolicy(o[1]);
@@ -898,7 +911,7 @@
   buildCounterListPoliciesResponse++;
   if (buildCounterListPoliciesResponse < 3) {
     o.nextPageToken = "foo";
-    o.policies = buildUnnamed1587();
+    o.policies = buildUnnamed1582();
   }
   buildCounterListPoliciesResponse--;
   return o;
@@ -908,32 +921,32 @@
   buildCounterListPoliciesResponse++;
   if (buildCounterListPoliciesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1587(o.policies);
+    checkUnnamed1582(o.policies);
   }
   buildCounterListPoliciesResponse--;
 }
 
-buildUnnamed1588() {
+buildUnnamed1583() {
   var o = new core.List<api.ManagedPropertyEntry>();
   o.add(buildManagedPropertyEntry());
   o.add(buildManagedPropertyEntry());
   return o;
 }
 
-checkUnnamed1588(core.List<api.ManagedPropertyEntry> o) {
+checkUnnamed1583(core.List<api.ManagedPropertyEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedPropertyEntry(o[0]);
   checkManagedPropertyEntry(o[1]);
 }
 
-buildUnnamed1589() {
+buildUnnamed1584() {
   var o = new core.List<api.ManagedProperty>();
   o.add(buildManagedProperty());
   o.add(buildManagedProperty());
   return o;
 }
 
-checkUnnamed1589(core.List<api.ManagedProperty> o) {
+checkUnnamed1584(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedProperty(o[0]);
   checkManagedProperty(o[1]);
@@ -944,11 +957,15 @@
   var o = new api.ManagedProperty();
   buildCounterManagedProperty++;
   if (buildCounterManagedProperty < 3) {
-    o.defaultValue = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.defaultValue = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.description = "foo";
-    o.entries = buildUnnamed1588();
+    o.entries = buildUnnamed1583();
     o.key = "foo";
-    o.nestedProperties = buildUnnamed1589();
+    o.nestedProperties = buildUnnamed1584();
     o.title = "foo";
     o.type = "foo";
   }
@@ -959,11 +976,15 @@
 checkManagedProperty(api.ManagedProperty o) {
   buildCounterManagedProperty++;
   if (buildCounterManagedProperty < 3) {
-    var casted3 = (o.defaultValue) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
+    var casted3 = (o.defaultValue) as core.Map;
+    unittest.expect(casted3, unittest.hasLength(3));
+    unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted3["bool"], unittest.equals(true));
+    unittest.expect(casted3["string"], unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1588(o.entries);
+    checkUnnamed1583(o.entries);
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed1589(o.nestedProperties);
+    checkUnnamed1584(o.nestedProperties);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -1063,7 +1084,11 @@
   var o = new api.NonComplianceDetail();
   buildCounterNonComplianceDetail++;
   if (buildCounterNonComplianceDetail < 3) {
-    o.currentValue = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.currentValue = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.fieldPath = "foo";
     o.installationFailureReason = "foo";
     o.nonComplianceReason = "foo";
@@ -1077,7 +1102,11 @@
 checkNonComplianceDetail(api.NonComplianceDetail o) {
   buildCounterNonComplianceDetail++;
   if (buildCounterNonComplianceDetail < 3) {
-    var casted4 = (o.currentValue) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+    var casted4 = (o.currentValue) as core.Map;
+    unittest.expect(casted4, unittest.hasLength(3));
+    unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted4["bool"], unittest.equals(true));
+    unittest.expect(casted4["string"], unittest.equals('foo'));
     unittest.expect(o.fieldPath, unittest.equals('foo'));
     unittest.expect(o.installationFailureReason, unittest.equals('foo'));
     unittest.expect(o.nonComplianceReason, unittest.equals('foo'));
@@ -1110,30 +1139,62 @@
   buildCounterNonComplianceDetailCondition--;
 }
 
-buildUnnamed1590() {
+buildUnnamed1585() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1590(core.Map<core.String, core.Object> o) {
+checkUnnamed1585(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1591() {
+buildUnnamed1586() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1591(core.Map<core.String, core.Object> o) {
+checkUnnamed1586(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -1143,9 +1204,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1590();
+    o.metadata = buildUnnamed1585();
     o.name = "foo";
-    o.response = buildUnnamed1591();
+    o.response = buildUnnamed1586();
   }
   buildCounterOperation--;
   return o;
@@ -1156,9 +1217,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1590(o.metadata);
+    checkUnnamed1585(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1591(o.response);
+    checkUnnamed1586(o.response);
   }
   buildCounterOperation--;
 }
@@ -1223,27 +1284,27 @@
   buildCounterPermissionGrant--;
 }
 
-buildUnnamed1592() {
+buildUnnamed1587() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1592(core.List<core.String> o) {
+checkUnnamed1587(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1593() {
+buildUnnamed1588() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1593(core.List<core.String> o) {
+checkUnnamed1588(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1254,8 +1315,8 @@
   var o = new api.PersistentPreferredActivity();
   buildCounterPersistentPreferredActivity++;
   if (buildCounterPersistentPreferredActivity < 3) {
-    o.actions = buildUnnamed1592();
-    o.categories = buildUnnamed1593();
+    o.actions = buildUnnamed1587();
+    o.categories = buildUnnamed1588();
     o.receiverActivity = "foo";
   }
   buildCounterPersistentPreferredActivity--;
@@ -1265,86 +1326,102 @@
 checkPersistentPreferredActivity(api.PersistentPreferredActivity o) {
   buildCounterPersistentPreferredActivity++;
   if (buildCounterPersistentPreferredActivity < 3) {
-    checkUnnamed1592(o.actions);
-    checkUnnamed1593(o.categories);
+    checkUnnamed1587(o.actions);
+    checkUnnamed1588(o.categories);
     unittest.expect(o.receiverActivity, unittest.equals('foo'));
   }
   buildCounterPersistentPreferredActivity--;
 }
 
-buildUnnamed1594() {
+buildUnnamed1589() {
   var o = new core.List<api.ApplicationPolicy>();
   o.add(buildApplicationPolicy());
   o.add(buildApplicationPolicy());
   return o;
 }
 
-checkUnnamed1594(core.List<api.ApplicationPolicy> o) {
+checkUnnamed1589(core.List<api.ApplicationPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApplicationPolicy(o[0]);
   checkApplicationPolicy(o[1]);
 }
 
-buildUnnamed1595() {
+buildUnnamed1590() {
   var o = new core.List<api.ComplianceRule>();
   o.add(buildComplianceRule());
   o.add(buildComplianceRule());
   return o;
 }
 
-checkUnnamed1595(core.List<api.ComplianceRule> o) {
+checkUnnamed1590(core.List<api.ComplianceRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComplianceRule(o[0]);
   checkComplianceRule(o[1]);
 }
 
-buildUnnamed1596() {
+buildUnnamed1591() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1596(core.List<core.String> o) {
+checkUnnamed1591(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1597() {
+buildUnnamed1592() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1597(core.Map<core.String, core.Object> o) {
+checkUnnamed1592(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o["x"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o["y"]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+  var casted9 = (o["x"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o["y"]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1598() {
+buildUnnamed1593() {
   var o = new core.List<api.PersistentPreferredActivity>();
   o.add(buildPersistentPreferredActivity());
   o.add(buildPersistentPreferredActivity());
   return o;
 }
 
-checkUnnamed1598(core.List<api.PersistentPreferredActivity> o) {
+checkUnnamed1593(core.List<api.PersistentPreferredActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersistentPreferredActivity(o[0]);
   checkPersistentPreferredActivity(o[1]);
 }
 
-buildUnnamed1599() {
+buildUnnamed1594() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1599(core.List<core.String> o) {
+checkUnnamed1594(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1357,14 +1434,14 @@
   if (buildCounterPolicy < 3) {
     o.addUserDisabled = true;
     o.adjustVolumeDisabled = true;
-    o.applications = buildUnnamed1594();
+    o.applications = buildUnnamed1589();
     o.blockApplicationsEnabled = true;
     o.cameraDisabled = true;
-    o.complianceRules = buildUnnamed1595();
+    o.complianceRules = buildUnnamed1590();
     o.debuggingFeaturesAllowed = true;
     o.defaultPermissionPolicy = "foo";
     o.factoryResetDisabled = true;
-    o.frpAdminEmails = buildUnnamed1596();
+    o.frpAdminEmails = buildUnnamed1591();
     o.funDisabled = true;
     o.installUnknownSourcesAllowed = true;
     o.keyguardDisabled = true;
@@ -1372,18 +1449,20 @@
     o.modifyAccountsDisabled = true;
     o.name = "foo";
     o.networkEscapeHatchEnabled = true;
-    o.openNetworkConfiguration = buildUnnamed1597();
+    o.openNetworkConfiguration = buildUnnamed1592();
     o.passwordRequirements = buildPasswordRequirements();
-    o.persistentPreferredActivities = buildUnnamed1598();
+    o.persistentPreferredActivities = buildUnnamed1593();
     o.removeUserDisabled = true;
     o.safeBootDisabled = true;
     o.screenCaptureDisabled = true;
     o.statusBarDisabled = true;
     o.statusReportingSettings = buildStatusReportingSettings();
-    o.stayOnPluggedModes = buildUnnamed1599();
+    o.stayOnPluggedModes = buildUnnamed1594();
     o.systemUpdate = buildSystemUpdate();
     o.unmuteMicrophoneDisabled = true;
     o.version = "foo";
+    o.wifiConfigDisabled = true;
+    o.wifiConfigsLockdownEnabled = true;
   }
   buildCounterPolicy--;
   return o;
@@ -1394,14 +1473,14 @@
   if (buildCounterPolicy < 3) {
     unittest.expect(o.addUserDisabled, unittest.isTrue);
     unittest.expect(o.adjustVolumeDisabled, unittest.isTrue);
-    checkUnnamed1594(o.applications);
+    checkUnnamed1589(o.applications);
     unittest.expect(o.blockApplicationsEnabled, unittest.isTrue);
     unittest.expect(o.cameraDisabled, unittest.isTrue);
-    checkUnnamed1595(o.complianceRules);
+    checkUnnamed1590(o.complianceRules);
     unittest.expect(o.debuggingFeaturesAllowed, unittest.isTrue);
     unittest.expect(o.defaultPermissionPolicy, unittest.equals('foo'));
     unittest.expect(o.factoryResetDisabled, unittest.isTrue);
-    checkUnnamed1596(o.frpAdminEmails);
+    checkUnnamed1591(o.frpAdminEmails);
     unittest.expect(o.funDisabled, unittest.isTrue);
     unittest.expect(o.installUnknownSourcesAllowed, unittest.isTrue);
     unittest.expect(o.keyguardDisabled, unittest.isTrue);
@@ -1409,18 +1488,20 @@
     unittest.expect(o.modifyAccountsDisabled, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.networkEscapeHatchEnabled, unittest.isTrue);
-    checkUnnamed1597(o.openNetworkConfiguration);
+    checkUnnamed1592(o.openNetworkConfiguration);
     checkPasswordRequirements(o.passwordRequirements);
-    checkUnnamed1598(o.persistentPreferredActivities);
+    checkUnnamed1593(o.persistentPreferredActivities);
     unittest.expect(o.removeUserDisabled, unittest.isTrue);
     unittest.expect(o.safeBootDisabled, unittest.isTrue);
     unittest.expect(o.screenCaptureDisabled, unittest.isTrue);
     unittest.expect(o.statusBarDisabled, unittest.isTrue);
     checkStatusReportingSettings(o.statusReportingSettings);
-    checkUnnamed1599(o.stayOnPluggedModes);
+    checkUnnamed1594(o.stayOnPluggedModes);
     checkSystemUpdate(o.systemUpdate);
     unittest.expect(o.unmuteMicrophoneDisabled, unittest.isTrue);
     unittest.expect(o.version, unittest.equals('foo'));
+    unittest.expect(o.wifiConfigDisabled, unittest.isTrue);
+    unittest.expect(o.wifiConfigsLockdownEnabled, unittest.isTrue);
   }
   buildCounterPolicy--;
 }
@@ -1498,30 +1579,46 @@
   buildCounterSoftwareInfo--;
 }
 
-buildUnnamed1600() {
+buildUnnamed1595() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1600(core.Map<core.String, core.Object> o) {
+checkUnnamed1595(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted11 = (o["x"]) as core.Map; unittest.expect(casted11, unittest.hasLength(3)); unittest.expect(casted11["list"], unittest.equals([1, 2, 3])); unittest.expect(casted11["bool"], unittest.equals(true)); unittest.expect(casted11["string"], unittest.equals('foo')); 
-  var casted12 = (o["y"]) as core.Map; unittest.expect(casted12, unittest.hasLength(3)); unittest.expect(casted12["list"], unittest.equals([1, 2, 3])); unittest.expect(casted12["bool"], unittest.equals(true)); unittest.expect(casted12["string"], unittest.equals('foo')); 
+  var casted11 = (o["x"]) as core.Map;
+  unittest.expect(casted11, unittest.hasLength(3));
+  unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted11["bool"], unittest.equals(true));
+  unittest.expect(casted11["string"], unittest.equals('foo'));
+  var casted12 = (o["y"]) as core.Map;
+  unittest.expect(casted12, unittest.hasLength(3));
+  unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted12["bool"], unittest.equals(true));
+  unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1601() {
+buildUnnamed1596() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1600());
-  o.add(buildUnnamed1600());
+  o.add(buildUnnamed1595());
+  o.add(buildUnnamed1595());
   return o;
 }
 
-checkUnnamed1601(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1596(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1600(o[0]);
-  checkUnnamed1600(o[1]);
+  checkUnnamed1595(o[0]);
+  checkUnnamed1595(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1530,7 +1627,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1601();
+    o.details = buildUnnamed1596();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1541,7 +1638,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1601(o.details);
+    checkUnnamed1596(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1599,14 +1696,14 @@
   buildCounterSystemUpdate--;
 }
 
-buildUnnamed1602() {
+buildUnnamed1597() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1602(core.Map<core.String, core.String> o) {
+checkUnnamed1597(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1618,7 +1715,7 @@
   buildCounterUserFacingMessage++;
   if (buildCounterUserFacingMessage < 3) {
     o.defaultMessage = "foo";
-    o.localizedMessages = buildUnnamed1602();
+    o.localizedMessages = buildUnnamed1597();
   }
   buildCounterUserFacingMessage--;
   return o;
@@ -1628,19 +1725,19 @@
   buildCounterUserFacingMessage++;
   if (buildCounterUserFacingMessage < 3) {
     unittest.expect(o.defaultMessage, unittest.equals('foo'));
-    checkUnnamed1602(o.localizedMessages);
+    checkUnnamed1597(o.localizedMessages);
   }
   buildCounterUserFacingMessage--;
 }
 
-buildUnnamed1603() {
+buildUnnamed1598() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1603(core.List<core.String> o) {
+checkUnnamed1598(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1653,7 +1750,7 @@
   if (buildCounterWebToken < 3) {
     o.name = "foo";
     o.parentFrameUrl = "foo";
-    o.permissions = buildUnnamed1603();
+    o.permissions = buildUnnamed1598();
     o.value = "foo";
   }
   buildCounterWebToken--;
@@ -1665,13 +1762,12 @@
   if (buildCounterWebToken < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentFrameUrl, unittest.equals('foo'));
-    checkUnnamed1603(o.permissions);
+    checkUnnamed1598(o.permissions);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterWebToken--;
 }
 
-
 main() {
   unittest.group("obj-schema-ApiLevelCondition", () {
     unittest.test("to-json--from-json", () {
@@ -1681,7 +1777,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Application", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplication();
@@ -1690,7 +1785,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationPermission", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationPermission();
@@ -1699,7 +1793,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationPolicy();
@@ -1708,7 +1801,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Command", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommand();
@@ -1717,7 +1809,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ComplianceRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildComplianceRule();
@@ -1726,7 +1817,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Device", () {
     unittest.test("to-json--from-json", () {
       var o = buildDevice();
@@ -1735,7 +1825,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Display", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisplay();
@@ -1744,7 +1833,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -1753,7 +1841,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnrollmentToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnrollmentToken();
@@ -1762,7 +1849,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Enterprise", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnterprise();
@@ -1771,7 +1857,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExternalData", () {
     unittest.test("to-json--from-json", () {
       var o = buildExternalData();
@@ -1780,7 +1865,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HardwareInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildHardwareInfo();
@@ -1789,7 +1873,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HardwareStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildHardwareStatus();
@@ -1798,7 +1881,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListDevicesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListDevicesResponse();
@@ -1807,7 +1889,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -1816,7 +1897,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListPoliciesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListPoliciesResponse();
@@ -1825,7 +1905,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedProperty", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedProperty();
@@ -1834,7 +1913,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedPropertyEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedPropertyEntry();
@@ -1843,7 +1921,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MemoryEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildMemoryEvent();
@@ -1852,7 +1929,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MemoryInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildMemoryInfo();
@@ -1861,7 +1937,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkInfo();
@@ -1870,7 +1945,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NonComplianceDetail", () {
     unittest.test("to-json--from-json", () {
       var o = buildNonComplianceDetail();
@@ -1879,7 +1953,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NonComplianceDetailCondition", () {
     unittest.test("to-json--from-json", () {
       var o = buildNonComplianceDetailCondition();
@@ -1888,7 +1961,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1897,7 +1969,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PasswordRequirements", () {
     unittest.test("to-json--from-json", () {
       var o = buildPasswordRequirements();
@@ -1906,7 +1977,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionGrant", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionGrant();
@@ -1915,7 +1985,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersistentPreferredActivity", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersistentPreferredActivity();
@@ -1924,7 +1993,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -1933,7 +2001,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PowerManagementEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildPowerManagementEvent();
@@ -1942,7 +2009,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SignupUrl", () {
     unittest.test("to-json--from-json", () {
       var o = buildSignupUrl();
@@ -1951,7 +2017,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SoftwareInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSoftwareInfo();
@@ -1960,7 +2025,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1969,7 +2033,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StatusReportingSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatusReportingSettings();
@@ -1978,7 +2041,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemUpdate", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemUpdate();
@@ -1987,7 +2049,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserFacingMessage", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserFacingMessage();
@@ -1996,7 +2057,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebToken();
@@ -2005,12 +2065,11 @@
     });
   });
 
-
   unittest.group("resource-EnterprisesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidmanagementApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises;
       var arg_request = buildEnterprise();
       var arg_signupUrlName = "foo";
       var arg_enterpriseToken = "foo";
@@ -2023,9 +2082,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/enterprises"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/enterprises"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -2038,41 +2099,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["signupUrlName"].first, unittest.equals(arg_signupUrlName));
-        unittest.expect(queryMap["enterpriseToken"].first, unittest.equals(arg_enterpriseToken));
-        unittest.expect(queryMap["projectId"].first, unittest.equals(arg_projectId));
-
+        unittest.expect(queryMap["signupUrlName"].first,
+            unittest.equals(arg_signupUrlName));
+        unittest.expect(queryMap["enterpriseToken"].first,
+            unittest.equals(arg_enterpriseToken));
+        unittest.expect(
+            queryMap["projectId"].first, unittest.equals(arg_projectId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, signupUrlName: arg_signupUrlName, enterpriseToken: arg_enterpriseToken, projectId: arg_projectId).then(unittest.expectAsync1(((api.Enterprise response) {
+      res
+          .create(arg_request,
+              signupUrlName: arg_signupUrlName,
+              enterpriseToken: arg_enterpriseToken,
+              projectId: arg_projectId)
+          .then(unittest.expectAsync1(((api.Enterprise response) {
         checkEnterprise(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidmanagementApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2086,16 +2158,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2106,9 +2179,9 @@
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesResourceApi res = new api.AndroidmanagementApi(mock).enterprises;
+      api.EnterprisesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises;
       var arg_request = buildEnterprise();
       var arg_name = "foo";
       var arg_updateMask = "foo";
@@ -2120,9 +2193,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2136,34 +2211,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnterprise());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Enterprise response) {
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Enterprise response) {
         checkEnterprise(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesApplicationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesApplicationsResourceApi res = new api.AndroidmanagementApi(mock).enterprises.applications;
+      api.EnterprisesApplicationsResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.applications;
       var arg_name = "foo";
       var arg_languageCode = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2171,9 +2248,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2187,43 +2266,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["languageCode"].first, unittest.equals(arg_languageCode));
-
+        unittest.expect(
+            queryMap["languageCode"].first, unittest.equals(arg_languageCode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApplication());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name, languageCode: arg_languageCode).then(unittest.expectAsync1(((api.Application response) {
+      res
+          .get(arg_name, languageCode: arg_languageCode)
+          .then(unittest.expectAsync1(((api.Application response) {
         checkApplication(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesDevicesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices;
+      api.EnterprisesDevicesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2237,16 +2320,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2257,18 +2341,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices;
+      api.EnterprisesDevicesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2282,16 +2368,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDevice());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2302,9 +2389,9 @@
     });
 
     unittest.test("method--issueCommand", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices;
+      api.EnterprisesDevicesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices;
       var arg_request = buildCommand();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2315,9 +2402,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2331,29 +2420,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.issueCommand(arg_request, arg_name).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .issueCommand(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices;
+      api.EnterprisesDevicesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices;
       var arg_parent = "foo";
       var arg_pageSize = 42;
       var arg_pageToken = "foo";
@@ -2362,9 +2454,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2378,31 +2472,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListDevicesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListDevicesResponse response) {
+      res
+          .list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListDevicesResponse response) {
         checkListDevicesResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices;
+      api.EnterprisesDevicesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices;
       var arg_request = buildDevice();
       var arg_name = "foo";
       var arg_updateMask = "foo";
@@ -2414,9 +2513,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2430,43 +2531,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDevice());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Device response) {
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Device response) {
         checkDevice(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesDevicesOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesOperationsResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices.operations;
+      api.EnterprisesDevicesOperationsResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2480,16 +2585,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2500,18 +2606,20 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesOperationsResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices.operations;
+      api.EnterprisesDevicesOperationsResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2525,16 +2633,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2545,18 +2654,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesOperationsResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices.operations;
+      api.EnterprisesDevicesOperationsResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2570,16 +2681,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2590,9 +2702,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesDevicesOperationsResourceApi res = new api.AndroidmanagementApi(mock).enterprises.devices.operations;
+      api.EnterprisesDevicesOperationsResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.devices.operations;
       var arg_name = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
@@ -2602,9 +2714,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2618,36 +2732,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageSize: arg_pageSize,
+              filter: arg_filter,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesEnrollmentTokensResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesEnrollmentTokensResourceApi res = new api.AndroidmanagementApi(mock).enterprises.enrollmentTokens;
+      api.EnterprisesEnrollmentTokensResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.enrollmentTokens;
       var arg_request = buildEnrollmentToken();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2658,9 +2778,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2674,38 +2796,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEnrollmentToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.EnrollmentToken response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.EnrollmentToken response) {
         checkEnrollmentToken(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesEnrollmentTokensResourceApi res = new api.AndroidmanagementApi(mock).enterprises.enrollmentTokens;
+      api.EnterprisesEnrollmentTokensResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.enrollmentTokens;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2719,16 +2846,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2737,24 +2865,24 @@
         checkEmpty(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesPoliciesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesPoliciesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.policies;
+      api.EnterprisesPoliciesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.policies;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2768,16 +2896,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2788,18 +2917,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesPoliciesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.policies;
+      api.EnterprisesPoliciesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.policies;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2813,16 +2944,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2833,9 +2965,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesPoliciesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.policies;
+      api.EnterprisesPoliciesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.policies;
       var arg_parent = "foo";
       var arg_pageSize = 42;
       var arg_pageToken = "foo";
@@ -2844,9 +2976,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2860,31 +2994,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListPoliciesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListPoliciesResponse response) {
+      res
+          .list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListPoliciesResponse response) {
         checkListPoliciesResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesPoliciesResourceApi res = new api.AndroidmanagementApi(mock).enterprises.policies;
+      api.EnterprisesPoliciesResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.policies;
       var arg_request = buildPolicy();
       var arg_name = "foo";
       var arg_updateMask = "foo";
@@ -2896,9 +3035,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2912,34 +3053,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EnterprisesWebTokensResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.EnterprisesWebTokensResourceApi res = new api.AndroidmanagementApi(mock).enterprises.webTokens;
+      api.EnterprisesWebTokensResourceApi res =
+          new api.AndroidmanagementApi(mock).enterprises.webTokens;
       var arg_request = buildWebToken();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2950,9 +3093,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2966,33 +3111,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.WebToken response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.WebToken response) {
         checkWebToken(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SignupUrlsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.SignupUrlsResourceApi res = new api.AndroidmanagementApi(mock).signupUrls;
+      api.SignupUrlsResourceApi res =
+          new api.AndroidmanagementApi(mock).signupUrls;
       var arg_callbackUrl = "foo";
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3000,9 +3146,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("v1/signupUrls"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("v1/signupUrls"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -3015,29 +3163,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["callbackUrl"].first, unittest.equals(arg_callbackUrl));
-        unittest.expect(queryMap["projectId"].first, unittest.equals(arg_projectId));
-
+        unittest.expect(
+            queryMap["callbackUrl"].first, unittest.equals(arg_callbackUrl));
+        unittest.expect(
+            queryMap["projectId"].first, unittest.equals(arg_projectId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSignupUrl());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(callbackUrl: arg_callbackUrl, projectId: arg_projectId).then(unittest.expectAsync1(((api.SignupUrl response) {
+      res
+          .create(callbackUrl: arg_callbackUrl, projectId: arg_projectId)
+          .then(unittest.expectAsync1(((api.SignupUrl response) {
         checkSignupUrl(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/androidpublisher/v2_test.dart b/generated/googleapis/test/androidpublisher/v2_test.dart
index b81d8d1..47dc85d 100644
--- a/generated/googleapis/test/androidpublisher/v2_test.dart
+++ b/generated/googleapis/test/androidpublisher/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.androidpublisher.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/androidpublisher/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -114,14 +113,14 @@
   buildCounterApkListing--;
 }
 
-buildUnnamed2526() {
+buildUnnamed2513() {
   var o = new core.List<api.ApkListing>();
   o.add(buildApkListing());
   o.add(buildApkListing());
   return o;
 }
 
-checkUnnamed2526(core.List<api.ApkListing> o) {
+checkUnnamed2513(core.List<api.ApkListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApkListing(o[0]);
   checkApkListing(o[1]);
@@ -133,7 +132,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed2526();
+    o.listings = buildUnnamed2513();
   }
   buildCounterApkListingsListResponse--;
   return o;
@@ -143,7 +142,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2526(o.listings);
+    checkUnnamed2513(o.listings);
   }
   buildCounterApkListingsListResponse--;
 }
@@ -186,14 +185,14 @@
   buildCounterApksAddExternallyHostedResponse--;
 }
 
-buildUnnamed2527() {
+buildUnnamed2514() {
   var o = new core.List<api.Apk>();
   o.add(buildApk());
   o.add(buildApk());
   return o;
 }
 
-checkUnnamed2527(core.List<api.Apk> o) {
+checkUnnamed2514(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApk(o[0]);
   checkApk(o[1]);
@@ -204,7 +203,7 @@
   var o = new api.ApksListResponse();
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    o.apks = buildUnnamed2527();
+    o.apks = buildUnnamed2514();
     o.kind = "foo";
   }
   buildCounterApksListResponse--;
@@ -214,7 +213,7 @@
 checkApksListResponse(api.ApksListResponse o) {
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    checkUnnamed2527(o.apks);
+    checkUnnamed2514(o.apks);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterApksListResponse--;
@@ -410,14 +409,14 @@
   buildCounterEntitlement--;
 }
 
-buildUnnamed2528() {
+buildUnnamed2515() {
   var o = new core.List<api.Entitlement>();
   o.add(buildEntitlement());
   o.add(buildEntitlement());
   return o;
 }
 
-checkUnnamed2528(core.List<api.Entitlement> o) {
+checkUnnamed2515(core.List<api.Entitlement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntitlement(o[0]);
   checkEntitlement(o[1]);
@@ -429,7 +428,7 @@
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
     o.pageInfo = buildPageInfo();
-    o.resources = buildUnnamed2528();
+    o.resources = buildUnnamed2515();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterEntitlementsListResponse--;
@@ -440,7 +439,7 @@
   buildCounterEntitlementsListResponse++;
   if (buildCounterEntitlementsListResponse < 3) {
     checkPageInfo(o.pageInfo);
-    checkUnnamed2528(o.resources);
+    checkUnnamed2515(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterEntitlementsListResponse--;
@@ -486,53 +485,53 @@
   buildCounterExpansionFilesUploadResponse--;
 }
 
-buildUnnamed2529() {
+buildUnnamed2516() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2529(core.List<core.String> o) {
+checkUnnamed2516(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2530() {
+buildUnnamed2517() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2530(core.List<core.String> o) {
+checkUnnamed2517(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2531() {
+buildUnnamed2518() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2531(core.List<core.String> o) {
+checkUnnamed2518(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2532() {
+buildUnnamed2519() {
   var o = new core.List<api.ExternallyHostedApkUsesPermission>();
   o.add(buildExternallyHostedApkUsesPermission());
   o.add(buildExternallyHostedApkUsesPermission());
   return o;
 }
 
-checkUnnamed2532(core.List<api.ExternallyHostedApkUsesPermission> o) {
+checkUnnamed2519(core.List<api.ExternallyHostedApkUsesPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExternallyHostedApkUsesPermission(o[0]);
   checkExternallyHostedApkUsesPermission(o[1]);
@@ -544,7 +543,7 @@
   buildCounterExternallyHostedApk++;
   if (buildCounterExternallyHostedApk < 3) {
     o.applicationLabel = "foo";
-    o.certificateBase64s = buildUnnamed2529();
+    o.certificateBase64s = buildUnnamed2516();
     o.externallyHostedUrl = "foo";
     o.fileSha1Base64 = "foo";
     o.fileSha256Base64 = "foo";
@@ -552,10 +551,10 @@
     o.iconBase64 = "foo";
     o.maximumSdk = 42;
     o.minimumSdk = 42;
-    o.nativeCodes = buildUnnamed2530();
+    o.nativeCodes = buildUnnamed2517();
     o.packageName = "foo";
-    o.usesFeatures = buildUnnamed2531();
-    o.usesPermissions = buildUnnamed2532();
+    o.usesFeatures = buildUnnamed2518();
+    o.usesPermissions = buildUnnamed2519();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -567,7 +566,7 @@
   buildCounterExternallyHostedApk++;
   if (buildCounterExternallyHostedApk < 3) {
     unittest.expect(o.applicationLabel, unittest.equals('foo'));
-    checkUnnamed2529(o.certificateBase64s);
+    checkUnnamed2516(o.certificateBase64s);
     unittest.expect(o.externallyHostedUrl, unittest.equals('foo'));
     unittest.expect(o.fileSha1Base64, unittest.equals('foo'));
     unittest.expect(o.fileSha256Base64, unittest.equals('foo'));
@@ -575,10 +574,10 @@
     unittest.expect(o.iconBase64, unittest.equals('foo'));
     unittest.expect(o.maximumSdk, unittest.equals(42));
     unittest.expect(o.minimumSdk, unittest.equals(42));
-    checkUnnamed2530(o.nativeCodes);
+    checkUnnamed2517(o.nativeCodes);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed2531(o.usesFeatures);
-    checkUnnamed2532(o.usesPermissions);
+    checkUnnamed2518(o.usesFeatures);
+    checkUnnamed2519(o.usesPermissions);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
@@ -597,7 +596,8 @@
   return o;
 }
 
-checkExternallyHostedApkUsesPermission(api.ExternallyHostedApkUsesPermission o) {
+checkExternallyHostedApkUsesPermission(
+    api.ExternallyHostedApkUsesPermission o) {
   buildCounterExternallyHostedApkUsesPermission++;
   if (buildCounterExternallyHostedApkUsesPermission < 3) {
     unittest.expect(o.maxSdkVersion, unittest.equals(42));
@@ -629,14 +629,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed2533() {
+buildUnnamed2520() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed2533(core.List<api.Image> o) {
+checkUnnamed2520(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -647,7 +647,7 @@
   var o = new api.ImagesDeleteAllResponse();
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    o.deleted = buildUnnamed2533();
+    o.deleted = buildUnnamed2520();
   }
   buildCounterImagesDeleteAllResponse--;
   return o;
@@ -656,19 +656,19 @@
 checkImagesDeleteAllResponse(api.ImagesDeleteAllResponse o) {
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    checkUnnamed2533(o.deleted);
+    checkUnnamed2520(o.deleted);
   }
   buildCounterImagesDeleteAllResponse--;
 }
 
-buildUnnamed2534() {
+buildUnnamed2521() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed2534(core.List<api.Image> o) {
+checkUnnamed2521(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -679,7 +679,7 @@
   var o = new api.ImagesListResponse();
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    o.images = buildUnnamed2534();
+    o.images = buildUnnamed2521();
   }
   buildCounterImagesListResponse--;
   return o;
@@ -688,7 +688,7 @@
 checkImagesListResponse(api.ImagesListResponse o) {
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    checkUnnamed2534(o.images);
+    checkUnnamed2521(o.images);
   }
   buildCounterImagesListResponse--;
 }
@@ -712,27 +712,27 @@
   buildCounterImagesUploadResponse--;
 }
 
-buildUnnamed2535() {
+buildUnnamed2522() {
   var o = new core.Map<core.String, api.InAppProductListing>();
   o["x"] = buildInAppProductListing();
   o["y"] = buildInAppProductListing();
   return o;
 }
 
-checkUnnamed2535(core.Map<core.String, api.InAppProductListing> o) {
+checkUnnamed2522(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProductListing(o["x"]);
   checkInAppProductListing(o["y"]);
 }
 
-buildUnnamed2536() {
+buildUnnamed2523() {
   var o = new core.Map<core.String, api.Price>();
   o["x"] = buildPrice();
   o["y"] = buildPrice();
   return o;
 }
 
-checkUnnamed2536(core.Map<core.String, api.Price> o) {
+checkUnnamed2523(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o["x"]);
   checkPrice(o["y"]);
@@ -745,9 +745,9 @@
   if (buildCounterInAppProduct < 3) {
     o.defaultLanguage = "foo";
     o.defaultPrice = buildPrice();
-    o.listings = buildUnnamed2535();
+    o.listings = buildUnnamed2522();
     o.packageName = "foo";
-    o.prices = buildUnnamed2536();
+    o.prices = buildUnnamed2523();
     o.purchaseType = "foo";
     o.season = buildSeason();
     o.sku = "foo";
@@ -764,9 +764,9 @@
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     checkPrice(o.defaultPrice);
-    checkUnnamed2535(o.listings);
+    checkUnnamed2522(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed2536(o.prices);
+    checkUnnamed2523(o.prices);
     unittest.expect(o.purchaseType, unittest.equals('foo'));
     checkSeason(o.season);
     unittest.expect(o.sku, unittest.equals('foo'));
@@ -798,14 +798,14 @@
   buildCounterInAppProductListing--;
 }
 
-buildUnnamed2537() {
+buildUnnamed2524() {
   var o = new core.List<api.InappproductsBatchRequestEntry>();
   o.add(buildInappproductsBatchRequestEntry());
   o.add(buildInappproductsBatchRequestEntry());
   return o;
 }
 
-checkUnnamed2537(core.List<api.InappproductsBatchRequestEntry> o) {
+checkUnnamed2524(core.List<api.InappproductsBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchRequestEntry(o[0]);
   checkInappproductsBatchRequestEntry(o[1]);
@@ -816,7 +816,7 @@
   var o = new api.InappproductsBatchRequest();
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    o.entrys = buildUnnamed2537();
+    o.entrys = buildUnnamed2524();
   }
   buildCounterInappproductsBatchRequest--;
   return o;
@@ -825,7 +825,7 @@
 checkInappproductsBatchRequest(api.InappproductsBatchRequest o) {
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    checkUnnamed2537(o.entrys);
+    checkUnnamed2524(o.entrys);
   }
   buildCounterInappproductsBatchRequest--;
 }
@@ -855,14 +855,14 @@
   buildCounterInappproductsBatchRequestEntry--;
 }
 
-buildUnnamed2538() {
+buildUnnamed2525() {
   var o = new core.List<api.InappproductsBatchResponseEntry>();
   o.add(buildInappproductsBatchResponseEntry());
   o.add(buildInappproductsBatchResponseEntry());
   return o;
 }
 
-checkUnnamed2538(core.List<api.InappproductsBatchResponseEntry> o) {
+checkUnnamed2525(core.List<api.InappproductsBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchResponseEntry(o[0]);
   checkInappproductsBatchResponseEntry(o[1]);
@@ -873,7 +873,7 @@
   var o = new api.InappproductsBatchResponse();
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    o.entrys = buildUnnamed2538();
+    o.entrys = buildUnnamed2525();
     o.kind = "foo";
   }
   buildCounterInappproductsBatchResponse--;
@@ -883,7 +883,7 @@
 checkInappproductsBatchResponse(api.InappproductsBatchResponse o) {
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    checkUnnamed2538(o.entrys);
+    checkUnnamed2525(o.entrys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInappproductsBatchResponse--;
@@ -950,14 +950,14 @@
   buildCounterInappproductsInsertResponse--;
 }
 
-buildUnnamed2539() {
+buildUnnamed2526() {
   var o = new core.List<api.InAppProduct>();
   o.add(buildInAppProduct());
   o.add(buildInAppProduct());
   return o;
 }
 
-checkUnnamed2539(core.List<api.InAppProduct> o) {
+checkUnnamed2526(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProduct(o[0]);
   checkInAppProduct(o[1]);
@@ -968,7 +968,7 @@
   var o = new api.InappproductsListResponse();
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    o.inappproduct = buildUnnamed2539();
+    o.inappproduct = buildUnnamed2526();
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
@@ -980,7 +980,7 @@
 checkInappproductsListResponse(api.InappproductsListResponse o) {
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    checkUnnamed2539(o.inappproduct);
+    checkUnnamed2526(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
@@ -1053,14 +1053,14 @@
   buildCounterListing--;
 }
 
-buildUnnamed2540() {
+buildUnnamed2527() {
   var o = new core.List<api.Listing>();
   o.add(buildListing());
   o.add(buildListing());
   return o;
 }
 
-checkUnnamed2540(core.List<api.Listing> o) {
+checkUnnamed2527(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListing(o[0]);
   checkListing(o[1]);
@@ -1072,7 +1072,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed2540();
+    o.listings = buildUnnamed2527();
   }
   buildCounterListingsListResponse--;
   return o;
@@ -1082,7 +1082,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2540(o.listings);
+    checkUnnamed2527(o.listings);
   }
   buildCounterListingsListResponse--;
 }
@@ -1202,14 +1202,14 @@
   buildCounterProrate--;
 }
 
-buildUnnamed2541() {
+buildUnnamed2528() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed2541(core.List<api.Comment> o) {
+checkUnnamed2528(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1221,7 +1221,7 @@
   buildCounterReview++;
   if (buildCounterReview < 3) {
     o.authorName = "foo";
-    o.comments = buildUnnamed2541();
+    o.comments = buildUnnamed2528();
     o.reviewId = "foo";
   }
   buildCounterReview--;
@@ -1232,7 +1232,7 @@
   buildCounterReview++;
   if (buildCounterReview < 3) {
     unittest.expect(o.authorName, unittest.equals('foo'));
-    checkUnnamed2541(o.comments);
+    checkUnnamed2528(o.comments);
     unittest.expect(o.reviewId, unittest.equals('foo'));
   }
   buildCounterReview--;
@@ -1259,14 +1259,14 @@
   buildCounterReviewReplyResult--;
 }
 
-buildUnnamed2542() {
+buildUnnamed2529() {
   var o = new core.List<api.Review>();
   o.add(buildReview());
   o.add(buildReview());
   return o;
 }
 
-checkUnnamed2542(core.List<api.Review> o) {
+checkUnnamed2529(core.List<api.Review> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReview(o[0]);
   checkReview(o[1]);
@@ -1278,7 +1278,7 @@
   buildCounterReviewsListResponse++;
   if (buildCounterReviewsListResponse < 3) {
     o.pageInfo = buildPageInfo();
-    o.reviews = buildUnnamed2542();
+    o.reviews = buildUnnamed2529();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterReviewsListResponse--;
@@ -1289,7 +1289,7 @@
   buildCounterReviewsListResponse++;
   if (buildCounterReviewsListResponse < 3) {
     checkPageInfo(o.pageInfo);
-    checkUnnamed2542(o.reviews);
+    checkUnnamed2529(o.reviews);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterReviewsListResponse--;
@@ -1333,14 +1333,14 @@
   buildCounterReviewsReplyResponse--;
 }
 
-buildUnnamed2543() {
+buildUnnamed2530() {
   var o = new core.List<api.Prorate>();
   o.add(buildProrate());
   o.add(buildProrate());
   return o;
 }
 
-checkUnnamed2543(core.List<api.Prorate> o) {
+checkUnnamed2530(core.List<api.Prorate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProrate(o[0]);
   checkProrate(o[1]);
@@ -1352,7 +1352,7 @@
   buildCounterSeason++;
   if (buildCounterSeason < 3) {
     o.end = buildMonthDay();
-    o.prorations = buildUnnamed2543();
+    o.prorations = buildUnnamed2530();
     o.start = buildMonthDay();
   }
   buildCounterSeason--;
@@ -1363,7 +1363,7 @@
   buildCounterSeason++;
   if (buildCounterSeason < 3) {
     checkMonthDay(o.end);
-    checkUnnamed2543(o.prorations);
+    checkUnnamed2530(o.prorations);
     checkMonthDay(o.start);
   }
   buildCounterSeason--;
@@ -1442,7 +1442,8 @@
   return o;
 }
 
-checkSubscriptionPurchasesDeferRequest(api.SubscriptionPurchasesDeferRequest o) {
+checkSubscriptionPurchasesDeferRequest(
+    api.SubscriptionPurchasesDeferRequest o) {
   buildCounterSubscriptionPurchasesDeferRequest++;
   if (buildCounterSubscriptionPurchasesDeferRequest < 3) {
     checkSubscriptionDeferralInfo(o.deferralInfo);
@@ -1461,7 +1462,8 @@
   return o;
 }
 
-checkSubscriptionPurchasesDeferResponse(api.SubscriptionPurchasesDeferResponse o) {
+checkSubscriptionPurchasesDeferResponse(
+    api.SubscriptionPurchasesDeferResponse o) {
   buildCounterSubscriptionPurchasesDeferResponse++;
   if (buildCounterSubscriptionPurchasesDeferResponse < 3) {
     unittest.expect(o.newExpiryTimeMillis, unittest.equals('foo'));
@@ -1469,27 +1471,27 @@
   buildCounterSubscriptionPurchasesDeferResponse--;
 }
 
-buildUnnamed2544() {
+buildUnnamed2531() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2544(core.List<core.String> o) {
+checkUnnamed2531(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2545() {
+buildUnnamed2532() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2545(core.List<core.String> o) {
+checkUnnamed2532(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1500,8 +1502,8 @@
   var o = new api.Testers();
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    o.googleGroups = buildUnnamed2544();
-    o.googlePlusCommunities = buildUnnamed2545();
+    o.googleGroups = buildUnnamed2531();
+    o.googlePlusCommunities = buildUnnamed2532();
   }
   buildCounterTesters--;
   return o;
@@ -1510,8 +1512,8 @@
 checkTesters(api.Testers o) {
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    checkUnnamed2544(o.googleGroups);
-    checkUnnamed2545(o.googlePlusCommunities);
+    checkUnnamed2531(o.googleGroups);
+    checkUnnamed2532(o.googlePlusCommunities);
   }
   buildCounterTesters--;
 }
@@ -1558,14 +1560,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed2546() {
+buildUnnamed2533() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2546(core.List<core.int> o) {
+checkUnnamed2533(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -1578,7 +1580,7 @@
   if (buildCounterTrack < 3) {
     o.track = "foo";
     o.userFraction = 42.0;
-    o.versionCodes = buildUnnamed2546();
+    o.versionCodes = buildUnnamed2533();
   }
   buildCounterTrack--;
   return o;
@@ -1589,19 +1591,19 @@
   if (buildCounterTrack < 3) {
     unittest.expect(o.track, unittest.equals('foo'));
     unittest.expect(o.userFraction, unittest.equals(42.0));
-    checkUnnamed2546(o.versionCodes);
+    checkUnnamed2533(o.versionCodes);
   }
   buildCounterTrack--;
 }
 
-buildUnnamed2547() {
+buildUnnamed2534() {
   var o = new core.List<api.Track>();
   o.add(buildTrack());
   o.add(buildTrack());
   return o;
 }
 
-checkUnnamed2547(core.List<api.Track> o) {
+checkUnnamed2534(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrack(o[0]);
   checkTrack(o[1]);
@@ -1613,7 +1615,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     o.kind = "foo";
-    o.tracks = buildUnnamed2547();
+    o.tracks = buildUnnamed2534();
   }
   buildCounterTracksListResponse--;
   return o;
@@ -1623,7 +1625,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2547(o.tracks);
+    checkUnnamed2534(o.tracks);
   }
   buildCounterTracksListResponse--;
 }
@@ -1694,14 +1696,14 @@
   buildCounterVoidedPurchase--;
 }
 
-buildUnnamed2548() {
+buildUnnamed2535() {
   var o = new core.List<api.VoidedPurchase>();
   o.add(buildVoidedPurchase());
   o.add(buildVoidedPurchase());
   return o;
 }
 
-checkUnnamed2548(core.List<api.VoidedPurchase> o) {
+checkUnnamed2535(core.List<api.VoidedPurchase> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVoidedPurchase(o[0]);
   checkVoidedPurchase(o[1]);
@@ -1714,7 +1716,7 @@
   if (buildCounterVoidedPurchasesListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
-    o.voidedPurchases = buildUnnamed2548();
+    o.voidedPurchases = buildUnnamed2535();
   }
   buildCounterVoidedPurchasesListResponse--;
   return o;
@@ -1725,12 +1727,11 @@
   if (buildCounterVoidedPurchasesListResponse < 3) {
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
-    checkUnnamed2548(o.voidedPurchases);
+    checkUnnamed2535(o.voidedPurchases);
   }
   buildCounterVoidedPurchasesListResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-Apk", () {
     unittest.test("to-json--from-json", () {
@@ -1740,7 +1741,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApkBinary", () {
     unittest.test("to-json--from-json", () {
       var o = buildApkBinary();
@@ -1749,7 +1749,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApkListing", () {
     unittest.test("to-json--from-json", () {
       var o = buildApkListing();
@@ -1758,7 +1757,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApkListingsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildApkListingsListResponse();
@@ -1767,7 +1765,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApksAddExternallyHostedRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildApksAddExternallyHostedRequest();
@@ -1776,7 +1773,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApksAddExternallyHostedResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildApksAddExternallyHostedResponse();
@@ -1785,7 +1781,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApksListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildApksListResponse();
@@ -1794,7 +1789,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppDetails();
@@ -1803,7 +1797,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppEdit", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppEdit();
@@ -1812,7 +1805,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Comment", () {
     unittest.test("to-json--from-json", () {
       var o = buildComment();
@@ -1821,7 +1813,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeobfuscationFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeobfuscationFile();
@@ -1830,7 +1821,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeobfuscationFilesUploadResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeobfuscationFilesUploadResponse();
@@ -1839,7 +1829,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeveloperComment", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeveloperComment();
@@ -1848,7 +1837,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeviceMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeviceMetadata();
@@ -1857,7 +1845,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Entitlement", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntitlement();
@@ -1866,7 +1853,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntitlementsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntitlementsListResponse();
@@ -1875,7 +1861,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExpansionFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildExpansionFile();
@@ -1884,7 +1869,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExpansionFilesUploadResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildExpansionFilesUploadResponse();
@@ -1893,7 +1877,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExternallyHostedApk", () {
     unittest.test("to-json--from-json", () {
       var o = buildExternallyHostedApk();
@@ -1902,7 +1885,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExternallyHostedApkUsesPermission", () {
     unittest.test("to-json--from-json", () {
       var o = buildExternallyHostedApkUsesPermission();
@@ -1911,7 +1893,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Image", () {
     unittest.test("to-json--from-json", () {
       var o = buildImage();
@@ -1920,7 +1901,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImagesDeleteAllResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildImagesDeleteAllResponse();
@@ -1929,7 +1909,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImagesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildImagesListResponse();
@@ -1938,7 +1917,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImagesUploadResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildImagesUploadResponse();
@@ -1947,7 +1925,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InAppProduct", () {
     unittest.test("to-json--from-json", () {
       var o = buildInAppProduct();
@@ -1956,7 +1933,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InAppProductListing", () {
     unittest.test("to-json--from-json", () {
       var o = buildInAppProductListing();
@@ -1965,7 +1941,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsBatchRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsBatchRequest();
@@ -1974,7 +1949,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsBatchRequestEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsBatchRequestEntry();
@@ -1983,7 +1957,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsBatchResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsBatchResponse();
@@ -1992,7 +1965,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsBatchResponseEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsBatchResponseEntry();
@@ -2001,7 +1973,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsInsertRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsInsertRequest();
@@ -2010,7 +1981,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsInsertResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsInsertResponse();
@@ -2019,7 +1989,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsListResponse();
@@ -2028,7 +1997,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsUpdateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsUpdateRequest();
@@ -2037,7 +2005,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InappproductsUpdateResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildInappproductsUpdateResponse();
@@ -2046,7 +2013,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Listing", () {
     unittest.test("to-json--from-json", () {
       var o = buildListing();
@@ -2055,7 +2021,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListingsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListingsListResponse();
@@ -2064,7 +2029,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonthDay", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonthDay();
@@ -2073,7 +2037,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageInfo();
@@ -2082,7 +2045,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Price", () {
     unittest.test("to-json--from-json", () {
       var o = buildPrice();
@@ -2091,7 +2053,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductPurchase", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductPurchase();
@@ -2100,7 +2061,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Prorate", () {
     unittest.test("to-json--from-json", () {
       var o = buildProrate();
@@ -2109,7 +2069,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Review", () {
     unittest.test("to-json--from-json", () {
       var o = buildReview();
@@ -2118,7 +2077,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReviewReplyResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildReviewReplyResult();
@@ -2127,7 +2085,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReviewsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReviewsListResponse();
@@ -2136,7 +2093,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReviewsReplyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReviewsReplyRequest();
@@ -2145,7 +2101,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReviewsReplyResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReviewsReplyResponse();
@@ -2154,7 +2109,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Season", () {
     unittest.test("to-json--from-json", () {
       var o = buildSeason();
@@ -2163,7 +2117,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionDeferralInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionDeferralInfo();
@@ -2172,7 +2125,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionPurchase", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionPurchase();
@@ -2181,7 +2133,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionPurchasesDeferRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionPurchasesDeferRequest();
@@ -2190,7 +2141,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionPurchasesDeferResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionPurchasesDeferResponse();
@@ -2199,7 +2149,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Testers", () {
     unittest.test("to-json--from-json", () {
       var o = buildTesters();
@@ -2208,7 +2157,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Timestamp", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimestamp();
@@ -2217,7 +2165,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TokenPagination", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokenPagination();
@@ -2226,7 +2173,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Track", () {
     unittest.test("to-json--from-json", () {
       var o = buildTrack();
@@ -2235,7 +2181,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TracksListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTracksListResponse();
@@ -2244,7 +2189,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserComment", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserComment();
@@ -2253,7 +2197,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VoidedPurchase", () {
     unittest.test("to-json--from-json", () {
       var o = buildVoidedPurchase();
@@ -2262,7 +2205,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VoidedPurchasesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVoidedPurchasesListResponse();
@@ -2271,10 +2213,8 @@
     });
   });
 
-
   unittest.group("resource-EditsResourceApi", () {
     unittest.test("method--commit", () {
-
       var mock = new HttpServerMock();
       api.EditsResourceApi res = new api.AndroidpublisherApi(mock).edits;
       var arg_packageName = "foo";
@@ -2284,7 +2224,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2297,27 +2238,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppEdit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.commit(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.AppEdit response) {
+      res
+          .commit(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.AppEdit response) {
         checkAppEdit(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.EditsResourceApi res = new api.AndroidpublisherApi(mock).edits;
       var arg_packageName = "foo";
@@ -2327,7 +2270,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2340,25 +2284,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_packageName, arg_editId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.EditsResourceApi res = new api.AndroidpublisherApi(mock).edits;
       var arg_packageName = "foo";
@@ -2368,7 +2314,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2381,27 +2328,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppEdit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.AppEdit response) {
+      res
+          .get(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.AppEdit response) {
         checkAppEdit(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.EditsResourceApi res = new api.AndroidpublisherApi(mock).edits;
       var arg_request = buildAppEdit();
@@ -2414,7 +2363,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2427,27 +2377,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppEdit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_packageName).then(unittest.expectAsync1(((api.AppEdit response) {
+      res
+          .insert(arg_request, arg_packageName)
+          .then(unittest.expectAsync1(((api.AppEdit response) {
         checkAppEdit(response);
       })));
     });
 
     unittest.test("method--validate", () {
-
       var mock = new HttpServerMock();
       api.EditsResourceApi res = new api.AndroidpublisherApi(mock).edits;
       var arg_packageName = "foo";
@@ -2457,7 +2409,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2470,33 +2423,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppEdit());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.validate(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.AppEdit response) {
+      res
+          .validate(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.AppEdit response) {
         checkAppEdit(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsApklistingsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EditsApklistingsResourceApi res = new api.AndroidpublisherApi(mock).edits.apklistings;
+      api.EditsApklistingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apklistings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -2506,7 +2460,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2519,27 +2474,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_packageName, arg_editId, arg_apkVersionCode, arg_language).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_packageName, arg_editId, arg_apkVersionCode, arg_language)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--deleteall", () {
-
       var mock = new HttpServerMock();
-      api.EditsApklistingsResourceApi res = new api.AndroidpublisherApi(mock).edits.apklistings;
+      api.EditsApklistingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apklistings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -2548,7 +2506,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2561,27 +2520,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteall(arg_packageName, arg_editId, arg_apkVersionCode).then(unittest.expectAsync1((_) {}));
+      res
+          .deleteall(arg_packageName, arg_editId, arg_apkVersionCode)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EditsApklistingsResourceApi res = new api.AndroidpublisherApi(mock).edits.apklistings;
+      api.EditsApklistingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apklistings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -2591,7 +2553,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2604,29 +2567,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApkListing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId, arg_apkVersionCode, arg_language).then(unittest.expectAsync1(((api.ApkListing response) {
+      res
+          .get(arg_packageName, arg_editId, arg_apkVersionCode, arg_language)
+          .then(unittest.expectAsync1(((api.ApkListing response) {
         checkApkListing(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EditsApklistingsResourceApi res = new api.AndroidpublisherApi(mock).edits.apklistings;
+      api.EditsApklistingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apklistings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -2635,7 +2601,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2648,29 +2615,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApkListingsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, arg_editId, arg_apkVersionCode).then(unittest.expectAsync1(((api.ApkListingsListResponse response) {
+      res
+          .list(arg_packageName, arg_editId, arg_apkVersionCode)
+          .then(unittest.expectAsync1(((api.ApkListingsListResponse response) {
         checkApkListingsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EditsApklistingsResourceApi res = new api.AndroidpublisherApi(mock).edits.apklistings;
+      api.EditsApklistingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apklistings;
       var arg_request = buildApkListing();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -2684,7 +2654,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2697,29 +2668,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApkListing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_editId, arg_apkVersionCode, arg_language).then(unittest.expectAsync1(((api.ApkListing response) {
+      res
+          .patch(arg_request, arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_language)
+          .then(unittest.expectAsync1(((api.ApkListing response) {
         checkApkListing(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EditsApklistingsResourceApi res = new api.AndroidpublisherApi(mock).edits.apklistings;
+      api.EditsApklistingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apklistings;
       var arg_request = buildApkListing();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -2733,7 +2708,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2746,33 +2722,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApkListing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_editId, arg_apkVersionCode, arg_language).then(unittest.expectAsync1(((api.ApkListing response) {
+      res
+          .update(arg_request, arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_language)
+          .then(unittest.expectAsync1(((api.ApkListing response) {
         checkApkListing(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsApksResourceApi", () {
     unittest.test("method--addexternallyhosted", () {
-
       var mock = new HttpServerMock();
-      api.EditsApksResourceApi res = new api.AndroidpublisherApi(mock).edits.apks;
+      api.EditsApksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apks;
       var arg_request = buildApksAddExternallyHostedRequest();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -2784,7 +2762,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2797,29 +2776,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApksAddExternallyHostedResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addexternallyhosted(arg_request, arg_packageName, arg_editId).then(unittest.expectAsync1(((api.ApksAddExternallyHostedResponse response) {
+      res.addexternallyhosted(arg_request, arg_packageName, arg_editId).then(
+          unittest
+              .expectAsync1(((api.ApksAddExternallyHostedResponse response) {
         checkApksAddExternallyHostedResponse(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EditsApksResourceApi res = new api.AndroidpublisherApi(mock).edits.apks;
+      api.EditsApksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apks;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2827,7 +2809,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2840,21 +2823,24 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApksListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.ApksListResponse response) {
+      res
+          .list(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.ApksListResponse response) {
         checkApksListResponse(response);
       })));
     });
@@ -2864,7 +2850,8 @@
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.EditsApksResourceApi res = new api.AndroidpublisherApi(mock).edits.apks;
+      api.EditsApksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.apks;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2872,7 +2859,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2885,35 +2873,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApk());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.upload(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.Apk response) {
+      res
+          .upload(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.Apk response) {
         checkApk(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsDeobfuscationfilesResourceApi", () {
     unittest.test("method--upload", () {
       // TODO: Implement tests for media upload;
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.EditsDeobfuscationfilesResourceApi res = new api.AndroidpublisherApi(mock).edits.deobfuscationfiles;
+      api.EditsDeobfuscationfilesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.deobfuscationfiles;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -2923,7 +2913,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2936,33 +2927,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeobfuscationFilesUploadResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.upload(arg_packageName, arg_editId, arg_apkVersionCode, arg_deobfuscationFileType).then(unittest.expectAsync1(((api.DeobfuscationFilesUploadResponse response) {
+      res
+          .upload(arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_deobfuscationFileType)
+          .then(unittest
+              .expectAsync1(((api.DeobfuscationFilesUploadResponse response) {
         checkDeobfuscationFilesUploadResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsDetailsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EditsDetailsResourceApi res = new api.AndroidpublisherApi(mock).edits.details;
+      api.EditsDetailsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.details;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2970,7 +2964,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2983,29 +2978,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppDetails());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.AppDetails response) {
+      res
+          .get(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.AppDetails response) {
         checkAppDetails(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EditsDetailsResourceApi res = new api.AndroidpublisherApi(mock).edits.details;
+      api.EditsDetailsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.details;
       var arg_request = buildAppDetails();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3017,7 +3015,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3030,29 +3029,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppDetails());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_editId).then(unittest.expectAsync1(((api.AppDetails response) {
+      res
+          .patch(arg_request, arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.AppDetails response) {
         checkAppDetails(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EditsDetailsResourceApi res = new api.AndroidpublisherApi(mock).edits.details;
+      api.EditsDetailsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.details;
       var arg_request = buildAppDetails();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3064,7 +3066,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3077,33 +3080,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppDetails());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_editId).then(unittest.expectAsync1(((api.AppDetails response) {
+      res
+          .update(arg_request, arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.AppDetails response) {
         checkAppDetails(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsExpansionfilesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EditsExpansionfilesResourceApi res = new api.AndroidpublisherApi(mock).edits.expansionfiles;
+      api.EditsExpansionfilesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.expansionfiles;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -3113,7 +3117,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3126,29 +3131,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExpansionFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId, arg_apkVersionCode, arg_expansionFileType).then(unittest.expectAsync1(((api.ExpansionFile response) {
+      res
+          .get(arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_expansionFileType)
+          .then(unittest.expectAsync1(((api.ExpansionFile response) {
         checkExpansionFile(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EditsExpansionfilesResourceApi res = new api.AndroidpublisherApi(mock).edits.expansionfiles;
+      api.EditsExpansionfilesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.expansionfiles;
       var arg_request = buildExpansionFile();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3162,7 +3171,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3175,29 +3185,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExpansionFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_editId, arg_apkVersionCode, arg_expansionFileType).then(unittest.expectAsync1(((api.ExpansionFile response) {
+      res
+          .patch(arg_request, arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_expansionFileType)
+          .then(unittest.expectAsync1(((api.ExpansionFile response) {
         checkExpansionFile(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EditsExpansionfilesResourceApi res = new api.AndroidpublisherApi(mock).edits.expansionfiles;
+      api.EditsExpansionfilesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.expansionfiles;
       var arg_request = buildExpansionFile();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3211,7 +3225,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3224,21 +3239,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExpansionFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_editId, arg_apkVersionCode, arg_expansionFileType).then(unittest.expectAsync1(((api.ExpansionFile response) {
+      res
+          .update(arg_request, arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_expansionFileType)
+          .then(unittest.expectAsync1(((api.ExpansionFile response) {
         checkExpansionFile(response);
       })));
     });
@@ -3248,7 +3267,8 @@
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.EditsExpansionfilesResourceApi res = new api.AndroidpublisherApi(mock).edits.expansionfiles;
+      api.EditsExpansionfilesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.expansionfiles;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_apkVersionCode = 42;
@@ -3258,7 +3278,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3271,33 +3292,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildExpansionFilesUploadResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.upload(arg_packageName, arg_editId, arg_apkVersionCode, arg_expansionFileType).then(unittest.expectAsync1(((api.ExpansionFilesUploadResponse response) {
+      res
+          .upload(arg_packageName, arg_editId, arg_apkVersionCode,
+              arg_expansionFileType)
+          .then(unittest
+              .expectAsync1(((api.ExpansionFilesUploadResponse response) {
         checkExpansionFilesUploadResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsImagesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EditsImagesResourceApi res = new api.AndroidpublisherApi(mock).edits.images;
+      api.EditsImagesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.images;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_language = "foo";
@@ -3308,7 +3332,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3321,27 +3346,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_packageName, arg_editId, arg_language, arg_imageType, arg_imageId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_packageName, arg_editId, arg_language, arg_imageType,
+              arg_imageId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--deleteall", () {
-
       var mock = new HttpServerMock();
-      api.EditsImagesResourceApi res = new api.AndroidpublisherApi(mock).edits.images;
+      api.EditsImagesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.images;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_language = "foo";
@@ -3351,7 +3380,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3364,29 +3394,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImagesDeleteAllResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteall(arg_packageName, arg_editId, arg_language, arg_imageType).then(unittest.expectAsync1(((api.ImagesDeleteAllResponse response) {
+      res
+          .deleteall(arg_packageName, arg_editId, arg_language, arg_imageType)
+          .then(unittest.expectAsync1(((api.ImagesDeleteAllResponse response) {
         checkImagesDeleteAllResponse(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EditsImagesResourceApi res = new api.AndroidpublisherApi(mock).edits.images;
+      api.EditsImagesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.images;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_language = "foo";
@@ -3396,7 +3429,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3409,21 +3443,24 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImagesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, arg_editId, arg_language, arg_imageType).then(unittest.expectAsync1(((api.ImagesListResponse response) {
+      res
+          .list(arg_packageName, arg_editId, arg_language, arg_imageType)
+          .then(unittest.expectAsync1(((api.ImagesListResponse response) {
         checkImagesListResponse(response);
       })));
     });
@@ -3433,7 +3470,8 @@
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.EditsImagesResourceApi res = new api.AndroidpublisherApi(mock).edits.images;
+      api.EditsImagesResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.images;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_language = "foo";
@@ -3443,7 +3481,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3456,33 +3495,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImagesUploadResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.upload(arg_packageName, arg_editId, arg_language, arg_imageType).then(unittest.expectAsync1(((api.ImagesUploadResponse response) {
+      res
+          .upload(arg_packageName, arg_editId, arg_language, arg_imageType)
+          .then(unittest.expectAsync1(((api.ImagesUploadResponse response) {
         checkImagesUploadResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsListingsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.EditsListingsResourceApi res = new api.AndroidpublisherApi(mock).edits.listings;
+      api.EditsListingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.listings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_language = "foo";
@@ -3491,7 +3531,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3504,27 +3545,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_packageName, arg_editId, arg_language).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_packageName, arg_editId, arg_language)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--deleteall", () {
-
       var mock = new HttpServerMock();
-      api.EditsListingsResourceApi res = new api.AndroidpublisherApi(mock).edits.listings;
+      api.EditsListingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.listings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3532,7 +3576,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3545,27 +3590,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteall(arg_packageName, arg_editId).then(unittest.expectAsync1((_) {}));
+      res
+          .deleteall(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EditsListingsResourceApi res = new api.AndroidpublisherApi(mock).edits.listings;
+      api.EditsListingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.listings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_language = "foo";
@@ -3574,7 +3622,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3587,29 +3636,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId, arg_language).then(unittest.expectAsync1(((api.Listing response) {
+      res
+          .get(arg_packageName, arg_editId, arg_language)
+          .then(unittest.expectAsync1(((api.Listing response) {
         checkListing(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EditsListingsResourceApi res = new api.AndroidpublisherApi(mock).edits.listings;
+      api.EditsListingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.listings;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3617,7 +3669,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3630,29 +3683,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListingsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.ListingsListResponse response) {
+      res
+          .list(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.ListingsListResponse response) {
         checkListingsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EditsListingsResourceApi res = new api.AndroidpublisherApi(mock).edits.listings;
+      api.EditsListingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.listings;
       var arg_request = buildListing();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3665,7 +3721,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3678,29 +3735,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_editId, arg_language).then(unittest.expectAsync1(((api.Listing response) {
+      res
+          .patch(arg_request, arg_packageName, arg_editId, arg_language)
+          .then(unittest.expectAsync1(((api.Listing response) {
         checkListing(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EditsListingsResourceApi res = new api.AndroidpublisherApi(mock).edits.listings;
+      api.EditsListingsResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.listings;
       var arg_request = buildListing();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3713,7 +3773,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3726,33 +3787,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_editId, arg_language).then(unittest.expectAsync1(((api.Listing response) {
+      res
+          .update(arg_request, arg_packageName, arg_editId, arg_language)
+          .then(unittest.expectAsync1(((api.Listing response) {
         checkListing(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsTestersResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EditsTestersResourceApi res = new api.AndroidpublisherApi(mock).edits.testers;
+      api.EditsTestersResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.testers;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_track = "foo";
@@ -3761,7 +3823,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3774,29 +3837,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTesters());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId, arg_track).then(unittest.expectAsync1(((api.Testers response) {
+      res
+          .get(arg_packageName, arg_editId, arg_track)
+          .then(unittest.expectAsync1(((api.Testers response) {
         checkTesters(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EditsTestersResourceApi res = new api.AndroidpublisherApi(mock).edits.testers;
+      api.EditsTestersResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.testers;
       var arg_request = buildTesters();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3809,7 +3875,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3822,29 +3889,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTesters());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_editId, arg_track).then(unittest.expectAsync1(((api.Testers response) {
+      res
+          .patch(arg_request, arg_packageName, arg_editId, arg_track)
+          .then(unittest.expectAsync1(((api.Testers response) {
         checkTesters(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EditsTestersResourceApi res = new api.AndroidpublisherApi(mock).edits.testers;
+      api.EditsTestersResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.testers;
       var arg_request = buildTesters();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3857,7 +3927,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3870,33 +3941,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTesters());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_editId, arg_track).then(unittest.expectAsync1(((api.Testers response) {
+      res
+          .update(arg_request, arg_packageName, arg_editId, arg_track)
+          .then(unittest.expectAsync1(((api.Testers response) {
         checkTesters(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EditsTracksResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EditsTracksResourceApi res = new api.AndroidpublisherApi(mock).edits.tracks;
+      api.EditsTracksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.tracks;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       var arg_track = "foo";
@@ -3905,7 +3977,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3918,29 +3991,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTrack());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_editId, arg_track).then(unittest.expectAsync1(((api.Track response) {
+      res
+          .get(arg_packageName, arg_editId, arg_track)
+          .then(unittest.expectAsync1(((api.Track response) {
         checkTrack(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EditsTracksResourceApi res = new api.AndroidpublisherApi(mock).edits.tracks;
+      api.EditsTracksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.tracks;
       var arg_packageName = "foo";
       var arg_editId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3948,7 +4024,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -3961,29 +4038,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTracksListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, arg_editId).then(unittest.expectAsync1(((api.TracksListResponse response) {
+      res
+          .list(arg_packageName, arg_editId)
+          .then(unittest.expectAsync1(((api.TracksListResponse response) {
         checkTracksListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.EditsTracksResourceApi res = new api.AndroidpublisherApi(mock).edits.tracks;
+      api.EditsTracksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.tracks;
       var arg_request = buildTrack();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -3996,7 +4076,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4009,29 +4090,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTrack());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_editId, arg_track).then(unittest.expectAsync1(((api.Track response) {
+      res
+          .patch(arg_request, arg_packageName, arg_editId, arg_track)
+          .then(unittest.expectAsync1(((api.Track response) {
         checkTrack(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.EditsTracksResourceApi res = new api.AndroidpublisherApi(mock).edits.tracks;
+      api.EditsTracksResourceApi res =
+          new api.AndroidpublisherApi(mock).edits.tracks;
       var arg_request = buildTrack();
       var arg_packageName = "foo";
       var arg_editId = "foo";
@@ -4044,7 +4128,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4057,33 +4142,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTrack());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_editId, arg_track).then(unittest.expectAsync1(((api.Track response) {
+      res
+          .update(arg_request, arg_packageName, arg_editId, arg_track)
+          .then(unittest.expectAsync1(((api.Track response) {
         checkTrack(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EntitlementsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.EntitlementsResourceApi res = new api.AndroidpublisherApi(mock).entitlements;
+      api.EntitlementsResourceApi res =
+          new api.AndroidpublisherApi(mock).entitlements;
       var arg_packageName = "foo";
       var arg_maxResults = 42;
       var arg_productId = "foo";
@@ -4094,7 +4180,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4107,37 +4194,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["productId"].first, unittest.equals(arg_productId));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["productId"].first, unittest.equals(arg_productId));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEntitlementsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, maxResults: arg_maxResults, productId: arg_productId, startIndex: arg_startIndex, token: arg_token).then(unittest.expectAsync1(((api.EntitlementsListResponse response) {
+      res
+          .list(arg_packageName,
+              maxResults: arg_maxResults,
+              productId: arg_productId,
+              startIndex: arg_startIndex,
+              token: arg_token)
+          .then(unittest.expectAsync1(((api.EntitlementsListResponse response) {
         checkEntitlementsListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-InappproductsResourceApi", () {
     unittest.test("method--batch", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_request = buildInappproductsBatchRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.InappproductsBatchRequest.fromJson(json);
@@ -4147,11 +4242,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("androidpublisher/v2/applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 33),
+            unittest.equals("androidpublisher/v2/applications/"));
         pathOffset += 33;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("inappproducts/batch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("inappproducts/batch"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -4164,29 +4262,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInappproductsBatchResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.batch(arg_request).then(unittest.expectAsync1(((api.InappproductsBatchResponse response) {
+      res.batch(arg_request).then(
+          unittest.expectAsync1(((api.InappproductsBatchResponse response) {
         checkInappproductsBatchResponse(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_packageName = "foo";
       var arg_sku = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4194,7 +4294,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4207,16 +4308,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4225,9 +4327,9 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_packageName = "foo";
       var arg_sku = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4235,7 +4337,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4248,29 +4351,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInAppProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_sku).then(unittest.expectAsync1(((api.InAppProduct response) {
+      res
+          .get(arg_packageName, arg_sku)
+          .then(unittest.expectAsync1(((api.InAppProduct response) {
         checkInAppProduct(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_request = buildInAppProduct();
       var arg_packageName = "foo";
       var arg_autoConvertMissingPrices = true;
@@ -4282,7 +4388,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4295,30 +4402,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoConvertMissingPrices"].first, unittest.equals("$arg_autoConvertMissingPrices"));
-
+        unittest.expect(queryMap["autoConvertMissingPrices"].first,
+            unittest.equals("$arg_autoConvertMissingPrices"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInAppProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_packageName, autoConvertMissingPrices: arg_autoConvertMissingPrices).then(unittest.expectAsync1(((api.InAppProduct response) {
+      res
+          .insert(arg_request, arg_packageName,
+              autoConvertMissingPrices: arg_autoConvertMissingPrices)
+          .then(unittest.expectAsync1(((api.InAppProduct response) {
         checkInAppProduct(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_packageName = "foo";
       var arg_maxResults = 42;
       var arg_startIndex = 42;
@@ -4328,7 +4440,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4341,32 +4454,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInappproductsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, maxResults: arg_maxResults, startIndex: arg_startIndex, token: arg_token).then(unittest.expectAsync1(((api.InappproductsListResponse response) {
+      res
+          .list(arg_packageName,
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              token: arg_token)
+          .then(
+              unittest.expectAsync1(((api.InappproductsListResponse response) {
         checkInappproductsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_request = buildInAppProduct();
       var arg_packageName = "foo";
       var arg_sku = "foo";
@@ -4379,7 +4501,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4392,30 +4515,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoConvertMissingPrices"].first, unittest.equals("$arg_autoConvertMissingPrices"));
-
+        unittest.expect(queryMap["autoConvertMissingPrices"].first,
+            unittest.equals("$arg_autoConvertMissingPrices"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInAppProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_packageName, arg_sku, autoConvertMissingPrices: arg_autoConvertMissingPrices).then(unittest.expectAsync1(((api.InAppProduct response) {
+      res
+          .patch(arg_request, arg_packageName, arg_sku,
+              autoConvertMissingPrices: arg_autoConvertMissingPrices)
+          .then(unittest.expectAsync1(((api.InAppProduct response) {
         checkInAppProduct(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.InappproductsResourceApi res = new api.AndroidpublisherApi(mock).inappproducts;
+      api.InappproductsResourceApi res =
+          new api.AndroidpublisherApi(mock).inappproducts;
       var arg_request = buildInAppProduct();
       var arg_packageName = "foo";
       var arg_sku = "foo";
@@ -4428,7 +4556,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4441,34 +4570,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoConvertMissingPrices"].first, unittest.equals("$arg_autoConvertMissingPrices"));
-
+        unittest.expect(queryMap["autoConvertMissingPrices"].first,
+            unittest.equals("$arg_autoConvertMissingPrices"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInAppProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_packageName, arg_sku, autoConvertMissingPrices: arg_autoConvertMissingPrices).then(unittest.expectAsync1(((api.InAppProduct response) {
+      res
+          .update(arg_request, arg_packageName, arg_sku,
+              autoConvertMissingPrices: arg_autoConvertMissingPrices)
+          .then(unittest.expectAsync1(((api.InAppProduct response) {
         checkInAppProduct(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PurchasesProductsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesProductsResourceApi res = new api.AndroidpublisherApi(mock).purchases.products;
+      api.PurchasesProductsResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.products;
       var arg_packageName = "foo";
       var arg_productId = "foo";
       var arg_token = "foo";
@@ -4477,7 +4609,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4490,33 +4623,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProductPurchase());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_productId, arg_token).then(unittest.expectAsync1(((api.ProductPurchase response) {
+      res
+          .get(arg_packageName, arg_productId, arg_token)
+          .then(unittest.expectAsync1(((api.ProductPurchase response) {
         checkProductPurchase(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PurchasesSubscriptionsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      api.PurchasesSubscriptionsResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.subscriptions;
       var arg_packageName = "foo";
       var arg_subscriptionId = "foo";
       var arg_token = "foo";
@@ -4525,7 +4659,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4538,27 +4673,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync1((_) {}));
+      res
+          .cancel(arg_packageName, arg_subscriptionId, arg_token)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--defer", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      api.PurchasesSubscriptionsResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.subscriptions;
       var arg_request = buildSubscriptionPurchasesDeferRequest();
       var arg_packageName = "foo";
       var arg_subscriptionId = "foo";
@@ -4571,7 +4709,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4584,29 +4723,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSubscriptionPurchasesDeferResponse());
+        var resp =
+            convert.JSON.encode(buildSubscriptionPurchasesDeferResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.defer(arg_request, arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync1(((api.SubscriptionPurchasesDeferResponse response) {
+      res
+          .defer(arg_request, arg_packageName, arg_subscriptionId, arg_token)
+          .then(unittest
+              .expectAsync1(((api.SubscriptionPurchasesDeferResponse response) {
         checkSubscriptionPurchasesDeferResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      api.PurchasesSubscriptionsResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.subscriptions;
       var arg_packageName = "foo";
       var arg_subscriptionId = "foo";
       var arg_token = "foo";
@@ -4615,7 +4759,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4628,29 +4773,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscriptionPurchase());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync1(((api.SubscriptionPurchase response) {
+      res
+          .get(arg_packageName, arg_subscriptionId, arg_token)
+          .then(unittest.expectAsync1(((api.SubscriptionPurchase response) {
         checkSubscriptionPurchase(response);
       })));
     });
 
     unittest.test("method--refund", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      api.PurchasesSubscriptionsResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.subscriptions;
       var arg_packageName = "foo";
       var arg_subscriptionId = "foo";
       var arg_token = "foo";
@@ -4659,7 +4807,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4672,27 +4821,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.refund(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync1((_) {}));
+      res
+          .refund(arg_packageName, arg_subscriptionId, arg_token)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--revoke", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      api.PurchasesSubscriptionsResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.subscriptions;
       var arg_packageName = "foo";
       var arg_subscriptionId = "foo";
       var arg_token = "foo";
@@ -4701,7 +4853,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4714,31 +4867,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.revoke(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync1((_) {}));
+      res
+          .revoke(arg_packageName, arg_subscriptionId, arg_token)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-PurchasesVoidedpurchasesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.PurchasesVoidedpurchasesResourceApi res = new api.AndroidpublisherApi(mock).purchases.voidedpurchases;
+      api.PurchasesVoidedpurchasesResourceApi res =
+          new api.AndroidpublisherApi(mock).purchases.voidedpurchases;
       var arg_packageName = "foo";
       var arg_endTime = "foo";
       var arg_maxResults = 42;
@@ -4750,7 +4904,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4763,36 +4918,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["endTime"].first, unittest.equals(arg_endTime));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
-        unittest.expect(queryMap["startTime"].first, unittest.equals(arg_startTime));
+        unittest.expect(
+            queryMap["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
+        unittest.expect(
+            queryMap["startTime"].first, unittest.equals(arg_startTime));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVoidedPurchasesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, endTime: arg_endTime, maxResults: arg_maxResults, startIndex: arg_startIndex, startTime: arg_startTime, token: arg_token).then(unittest.expectAsync1(((api.VoidedPurchasesListResponse response) {
+      res
+          .list(arg_packageName,
+              endTime: arg_endTime,
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              startTime: arg_startTime,
+              token: arg_token)
+          .then(unittest
+              .expectAsync1(((api.VoidedPurchasesListResponse response) {
         checkVoidedPurchasesListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReviewsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ReviewsResourceApi res = new api.AndroidpublisherApi(mock).reviews;
       var arg_packageName = "foo";
@@ -4803,7 +4968,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4816,28 +4982,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["translationLanguage"].first, unittest.equals(arg_translationLanguage));
-
+        unittest.expect(queryMap["translationLanguage"].first,
+            unittest.equals(arg_translationLanguage));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReview());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_packageName, arg_reviewId, translationLanguage: arg_translationLanguage).then(unittest.expectAsync1(((api.Review response) {
+      res
+          .get(arg_packageName, arg_reviewId,
+              translationLanguage: arg_translationLanguage)
+          .then(unittest.expectAsync1(((api.Review response) {
         checkReview(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ReviewsResourceApi res = new api.AndroidpublisherApi(mock).reviews;
       var arg_packageName = "foo";
@@ -4850,7 +5020,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4863,31 +5034,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
-        unittest.expect(queryMap["translationLanguage"].first, unittest.equals(arg_translationLanguage));
-
+        unittest.expect(queryMap["translationLanguage"].first,
+            unittest.equals(arg_translationLanguage));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReviewsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_packageName, maxResults: arg_maxResults, startIndex: arg_startIndex, token: arg_token, translationLanguage: arg_translationLanguage).then(unittest.expectAsync1(((api.ReviewsListResponse response) {
+      res
+          .list(arg_packageName,
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              token: arg_token,
+              translationLanguage: arg_translationLanguage)
+          .then(unittest.expectAsync1(((api.ReviewsListResponse response) {
         checkReviewsListResponse(response);
       })));
     });
 
     unittest.test("method--reply", () {
-
       var mock = new HttpServerMock();
       api.ReviewsResourceApi res = new api.AndroidpublisherApi(mock).reviews;
       var arg_request = buildReviewsReplyRequest();
@@ -4901,7 +5081,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -4914,27 +5095,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReviewsReplyResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reply(arg_request, arg_packageName, arg_reviewId).then(unittest.expectAsync1(((api.ReviewsReplyResponse response) {
+      res
+          .reply(arg_request, arg_packageName, arg_reviewId)
+          .then(unittest.expectAsync1(((api.ReviewsReplyResponse response) {
         checkReviewsReplyResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/appengine/v1_test.dart b/generated/googleapis/test/appengine/v1_test.dart
index c3ed74a..683f208 100644
--- a/generated/googleapis/test/appengine/v1_test.dart
+++ b/generated/googleapis/test/appengine/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.appengine.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/appengine/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -97,14 +96,14 @@
   buildCounterApiEndpointHandler--;
 }
 
-buildUnnamed2681() {
+buildUnnamed2668() {
   var o = new core.List<api.UrlDispatchRule>();
   o.add(buildUrlDispatchRule());
   o.add(buildUrlDispatchRule());
   return o;
 }
 
-checkUnnamed2681(core.List<api.UrlDispatchRule> o) {
+checkUnnamed2668(core.List<api.UrlDispatchRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlDispatchRule(o[0]);
   checkUrlDispatchRule(o[1]);
@@ -120,7 +119,8 @@
     o.defaultBucket = "foo";
     o.defaultCookieExpiration = "foo";
     o.defaultHostname = "foo";
-    o.dispatchRules = buildUnnamed2681();
+    o.dispatchRules = buildUnnamed2668();
+    o.featureSettings = buildFeatureSettings();
     o.gcrDomain = "foo";
     o.iap = buildIdentityAwareProxy();
     o.id = "foo";
@@ -140,7 +140,8 @@
     unittest.expect(o.defaultBucket, unittest.equals('foo'));
     unittest.expect(o.defaultCookieExpiration, unittest.equals('foo'));
     unittest.expect(o.defaultHostname, unittest.equals('foo'));
-    checkUnnamed2681(o.dispatchRules);
+    checkUnnamed2668(o.dispatchRules);
+    checkFeatureSettings(o.featureSettings);
     unittest.expect(o.gcrDomain, unittest.equals('foo'));
     checkIdentityAwareProxy(o.iap);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -151,6 +152,86 @@
   buildCounterApplication--;
 }
 
+buildUnnamed2669() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2669(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2670() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2670(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterAuthorizedCertificate = 0;
+buildAuthorizedCertificate() {
+  var o = new api.AuthorizedCertificate();
+  buildCounterAuthorizedCertificate++;
+  if (buildCounterAuthorizedCertificate < 3) {
+    o.certificateRawData = buildCertificateRawData();
+    o.displayName = "foo";
+    o.domainMappingsCount = 42;
+    o.domainNames = buildUnnamed2669();
+    o.expireTime = "foo";
+    o.id = "foo";
+    o.name = "foo";
+    o.visibleDomainMappings = buildUnnamed2670();
+  }
+  buildCounterAuthorizedCertificate--;
+  return o;
+}
+
+checkAuthorizedCertificate(api.AuthorizedCertificate o) {
+  buildCounterAuthorizedCertificate++;
+  if (buildCounterAuthorizedCertificate < 3) {
+    checkCertificateRawData(o.certificateRawData);
+    unittest.expect(o.displayName, unittest.equals('foo'));
+    unittest.expect(o.domainMappingsCount, unittest.equals(42));
+    checkUnnamed2669(o.domainNames);
+    unittest.expect(o.expireTime, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed2670(o.visibleDomainMappings);
+  }
+  buildCounterAuthorizedCertificate--;
+}
+
+core.int buildCounterAuthorizedDomain = 0;
+buildAuthorizedDomain() {
+  var o = new api.AuthorizedDomain();
+  buildCounterAuthorizedDomain++;
+  if (buildCounterAuthorizedDomain < 3) {
+    o.id = "foo";
+    o.name = "foo";
+  }
+  buildCounterAuthorizedDomain--;
+  return o;
+}
+
+checkAuthorizedDomain(api.AuthorizedDomain o) {
+  buildCounterAuthorizedDomain++;
+  if (buildCounterAuthorizedDomain < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterAuthorizedDomain--;
+}
+
 core.int buildCounterAutomaticScaling = 0;
 buildAutomaticScaling() {
   var o = new api.AutomaticScaling();
@@ -213,6 +294,27 @@
   buildCounterBasicScaling--;
 }
 
+core.int buildCounterCertificateRawData = 0;
+buildCertificateRawData() {
+  var o = new api.CertificateRawData();
+  buildCounterCertificateRawData++;
+  if (buildCounterCertificateRawData < 3) {
+    o.privateKey = "foo";
+    o.publicCertificate = "foo";
+  }
+  buildCounterCertificateRawData--;
+  return o;
+}
+
+checkCertificateRawData(api.CertificateRawData o) {
+  buildCounterCertificateRawData++;
+  if (buildCounterCertificateRawData < 3) {
+    unittest.expect(o.privateKey, unittest.equals('foo'));
+    unittest.expect(o.publicCertificate, unittest.equals('foo'));
+  }
+  buildCounterCertificateRawData--;
+}
+
 core.int buildCounterContainerInfo = 0;
 buildContainerInfo() {
   var o = new api.ContainerInfo();
@@ -272,14 +374,14 @@
   buildCounterDebugInstanceRequest--;
 }
 
-buildUnnamed2682() {
+buildUnnamed2671() {
   var o = new core.Map<core.String, api.FileInfo>();
   o["x"] = buildFileInfo();
   o["y"] = buildFileInfo();
   return o;
 }
 
-checkUnnamed2682(core.Map<core.String, api.FileInfo> o) {
+checkUnnamed2671(core.Map<core.String, api.FileInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFileInfo(o["x"]);
   checkFileInfo(o["y"]);
@@ -291,7 +393,7 @@
   buildCounterDeployment++;
   if (buildCounterDeployment < 3) {
     o.container = buildContainerInfo();
-    o.files = buildUnnamed2682();
+    o.files = buildUnnamed2671();
     o.zip = buildZipInfo();
   }
   buildCounterDeployment--;
@@ -302,7 +404,7 @@
   buildCounterDeployment++;
   if (buildCounterDeployment < 3) {
     checkContainerInfo(o.container);
-    checkUnnamed2682(o.files);
+    checkUnnamed2671(o.files);
     checkZipInfo(o.zip);
   }
   buildCounterDeployment--;
@@ -333,6 +435,59 @@
   buildCounterDiskUtilization--;
 }
 
+buildUnnamed2672() {
+  var o = new core.List<api.ResourceRecord>();
+  o.add(buildResourceRecord());
+  o.add(buildResourceRecord());
+  return o;
+}
+
+checkUnnamed2672(core.List<api.ResourceRecord> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkResourceRecord(o[0]);
+  checkResourceRecord(o[1]);
+}
+
+core.int buildCounterDomainMapping = 0;
+buildDomainMapping() {
+  var o = new api.DomainMapping();
+  buildCounterDomainMapping++;
+  if (buildCounterDomainMapping < 3) {
+    o.id = "foo";
+    o.name = "foo";
+    o.resourceRecords = buildUnnamed2672();
+    o.sslSettings = buildSslSettings();
+  }
+  buildCounterDomainMapping--;
+  return o;
+}
+
+checkDomainMapping(api.DomainMapping o) {
+  buildCounterDomainMapping++;
+  if (buildCounterDomainMapping < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed2672(o.resourceRecords);
+    checkSslSettings(o.sslSettings);
+  }
+  buildCounterDomainMapping--;
+}
+
+core.int buildCounterEmpty = 0;
+buildEmpty() {
+  var o = new api.Empty();
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+  return o;
+}
+
+checkEmpty(api.Empty o) {
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+}
+
 core.int buildCounterEndpointsApiService = 0;
 buildEndpointsApiService() {
   var o = new api.EndpointsApiService();
@@ -377,6 +532,25 @@
   buildCounterErrorHandler--;
 }
 
+core.int buildCounterFeatureSettings = 0;
+buildFeatureSettings() {
+  var o = new api.FeatureSettings();
+  buildCounterFeatureSettings++;
+  if (buildCounterFeatureSettings < 3) {
+    o.splitHealthChecks = true;
+  }
+  buildCounterFeatureSettings--;
+  return o;
+}
+
+checkFeatureSettings(api.FeatureSettings o) {
+  buildCounterFeatureSettings++;
+  if (buildCounterFeatureSettings < 3) {
+    unittest.expect(o.splitHealthChecks, unittest.isTrue);
+  }
+  buildCounterFeatureSettings--;
+}
+
 core.int buildCounterFileInfo = 0;
 buildFileInfo() {
   var o = new api.FileInfo();
@@ -526,14 +700,117 @@
   buildCounterLibrary--;
 }
 
-buildUnnamed2683() {
+buildUnnamed2673() {
+  var o = new core.List<api.AuthorizedCertificate>();
+  o.add(buildAuthorizedCertificate());
+  o.add(buildAuthorizedCertificate());
+  return o;
+}
+
+checkUnnamed2673(core.List<api.AuthorizedCertificate> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkAuthorizedCertificate(o[0]);
+  checkAuthorizedCertificate(o[1]);
+}
+
+core.int buildCounterListAuthorizedCertificatesResponse = 0;
+buildListAuthorizedCertificatesResponse() {
+  var o = new api.ListAuthorizedCertificatesResponse();
+  buildCounterListAuthorizedCertificatesResponse++;
+  if (buildCounterListAuthorizedCertificatesResponse < 3) {
+    o.certificates = buildUnnamed2673();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListAuthorizedCertificatesResponse--;
+  return o;
+}
+
+checkListAuthorizedCertificatesResponse(
+    api.ListAuthorizedCertificatesResponse o) {
+  buildCounterListAuthorizedCertificatesResponse++;
+  if (buildCounterListAuthorizedCertificatesResponse < 3) {
+    checkUnnamed2673(o.certificates);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListAuthorizedCertificatesResponse--;
+}
+
+buildUnnamed2674() {
+  var o = new core.List<api.AuthorizedDomain>();
+  o.add(buildAuthorizedDomain());
+  o.add(buildAuthorizedDomain());
+  return o;
+}
+
+checkUnnamed2674(core.List<api.AuthorizedDomain> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkAuthorizedDomain(o[0]);
+  checkAuthorizedDomain(o[1]);
+}
+
+core.int buildCounterListAuthorizedDomainsResponse = 0;
+buildListAuthorizedDomainsResponse() {
+  var o = new api.ListAuthorizedDomainsResponse();
+  buildCounterListAuthorizedDomainsResponse++;
+  if (buildCounterListAuthorizedDomainsResponse < 3) {
+    o.domains = buildUnnamed2674();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListAuthorizedDomainsResponse--;
+  return o;
+}
+
+checkListAuthorizedDomainsResponse(api.ListAuthorizedDomainsResponse o) {
+  buildCounterListAuthorizedDomainsResponse++;
+  if (buildCounterListAuthorizedDomainsResponse < 3) {
+    checkUnnamed2674(o.domains);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListAuthorizedDomainsResponse--;
+}
+
+buildUnnamed2675() {
+  var o = new core.List<api.DomainMapping>();
+  o.add(buildDomainMapping());
+  o.add(buildDomainMapping());
+  return o;
+}
+
+checkUnnamed2675(core.List<api.DomainMapping> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDomainMapping(o[0]);
+  checkDomainMapping(o[1]);
+}
+
+core.int buildCounterListDomainMappingsResponse = 0;
+buildListDomainMappingsResponse() {
+  var o = new api.ListDomainMappingsResponse();
+  buildCounterListDomainMappingsResponse++;
+  if (buildCounterListDomainMappingsResponse < 3) {
+    o.domainMappings = buildUnnamed2675();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListDomainMappingsResponse--;
+  return o;
+}
+
+checkListDomainMappingsResponse(api.ListDomainMappingsResponse o) {
+  buildCounterListDomainMappingsResponse++;
+  if (buildCounterListDomainMappingsResponse < 3) {
+    checkUnnamed2675(o.domainMappings);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListDomainMappingsResponse--;
+}
+
+buildUnnamed2676() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2683(core.List<api.Instance> o) {
+checkUnnamed2676(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -544,7 +821,7 @@
   var o = new api.ListInstancesResponse();
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    o.instances = buildUnnamed2683();
+    o.instances = buildUnnamed2676();
     o.nextPageToken = "foo";
   }
   buildCounterListInstancesResponse--;
@@ -554,20 +831,20 @@
 checkListInstancesResponse(api.ListInstancesResponse o) {
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    checkUnnamed2683(o.instances);
+    checkUnnamed2676(o.instances);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInstancesResponse--;
 }
 
-buildUnnamed2684() {
+buildUnnamed2677() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed2684(core.List<api.Location> o) {
+checkUnnamed2677(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -578,7 +855,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed2684();
+    o.locations = buildUnnamed2677();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -588,20 +865,20 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed2684(o.locations);
+    checkUnnamed2677(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed2685() {
+buildUnnamed2678() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2685(core.List<api.Operation> o) {
+checkUnnamed2678(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -613,7 +890,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2685();
+    o.operations = buildUnnamed2678();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -623,19 +900,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2685(o.operations);
+    checkUnnamed2678(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed2686() {
+buildUnnamed2679() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed2686(core.List<api.Service> o) {
+checkUnnamed2679(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -647,7 +924,7 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed2686();
+    o.services = buildUnnamed2679();
   }
   buildCounterListServicesResponse--;
   return o;
@@ -657,19 +934,19 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2686(o.services);
+    checkUnnamed2679(o.services);
   }
   buildCounterListServicesResponse--;
 }
 
-buildUnnamed2687() {
+buildUnnamed2680() {
   var o = new core.List<api.Version>();
   o.add(buildVersion());
   o.add(buildVersion());
   return o;
 }
 
-checkUnnamed2687(core.List<api.Version> o) {
+checkUnnamed2680(core.List<api.Version> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVersion(o[0]);
   checkVersion(o[1]);
@@ -681,7 +958,7 @@
   buildCounterListVersionsResponse++;
   if (buildCounterListVersionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.versions = buildUnnamed2687();
+    o.versions = buildUnnamed2680();
   }
   buildCounterListVersionsResponse--;
   return o;
@@ -691,7 +968,7 @@
   buildCounterListVersionsResponse++;
   if (buildCounterListVersionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2687(o.versions);
+    checkUnnamed2680(o.versions);
   }
   buildCounterListVersionsResponse--;
 }
@@ -727,30 +1004,46 @@
   buildCounterLivenessCheck--;
 }
 
-buildUnnamed2688() {
+buildUnnamed2681() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2688(core.Map<core.String, core.String> o) {
+checkUnnamed2681(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2689() {
+buildUnnamed2682() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2689(core.Map<core.String, core.Object> o) {
+checkUnnamed2682(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterLocation = 0;
@@ -758,9 +1051,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed2688();
+    o.labels = buildUnnamed2681();
     o.locationId = "foo";
-    o.metadata = buildUnnamed2689();
+    o.metadata = buildUnnamed2682();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -770,9 +1063,9 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed2688(o.labels);
+    checkUnnamed2681(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed2689(o.metadata);
+    checkUnnamed2682(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
@@ -818,14 +1111,14 @@
   buildCounterManualScaling--;
 }
 
-buildUnnamed2690() {
+buildUnnamed2683() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2690(core.List<core.String> o) {
+checkUnnamed2683(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -836,7 +1129,7 @@
   var o = new api.Network();
   buildCounterNetwork++;
   if (buildCounterNetwork < 3) {
-    o.forwardedPorts = buildUnnamed2690();
+    o.forwardedPorts = buildUnnamed2683();
     o.instanceTag = "foo";
     o.name = "foo";
     o.subnetworkName = "foo";
@@ -848,7 +1141,7 @@
 checkNetwork(api.Network o) {
   buildCounterNetwork++;
   if (buildCounterNetwork < 3) {
-    checkUnnamed2690(o.forwardedPorts);
+    checkUnnamed2683(o.forwardedPorts);
     unittest.expect(o.instanceTag, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.subnetworkName, unittest.equals('foo'));
@@ -881,30 +1174,62 @@
   buildCounterNetworkUtilization--;
 }
 
-buildUnnamed2691() {
+buildUnnamed2684() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2691(core.Map<core.String, core.Object> o) {
+checkUnnamed2684(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2692() {
+buildUnnamed2685() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2692(core.Map<core.String, core.Object> o) {
+checkUnnamed2685(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -914,9 +1239,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2691();
+    o.metadata = buildUnnamed2684();
     o.name = "foo";
-    o.response = buildUnnamed2692();
+    o.response = buildUnnamed2685();
   }
   buildCounterOperation--;
   return o;
@@ -927,9 +1252,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2691(o.metadata);
+    checkUnnamed2684(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2692(o.response);
+    checkUnnamed2685(o.response);
   }
   buildCounterOperation--;
 }
@@ -990,14 +1315,14 @@
   buildCounterOperationMetadataExperimental--;
 }
 
-buildUnnamed2693() {
+buildUnnamed2686() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2693(core.List<core.String> o) {
+checkUnnamed2686(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1014,7 +1339,7 @@
     o.method = "foo";
     o.target = "foo";
     o.user = "foo";
-    o.warning = buildUnnamed2693();
+    o.warning = buildUnnamed2686();
   }
   buildCounterOperationMetadataV1--;
   return o;
@@ -1029,19 +1354,19 @@
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2693(o.warning);
+    checkUnnamed2686(o.warning);
   }
   buildCounterOperationMetadataV1--;
 }
 
-buildUnnamed2694() {
+buildUnnamed2687() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2694(core.List<core.String> o) {
+checkUnnamed2687(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1058,7 +1383,7 @@
     o.method = "foo";
     o.target = "foo";
     o.user = "foo";
-    o.warning = buildUnnamed2694();
+    o.warning = buildUnnamed2687();
   }
   buildCounterOperationMetadataV1Alpha--;
   return o;
@@ -1073,19 +1398,19 @@
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2694(o.warning);
+    checkUnnamed2687(o.warning);
   }
   buildCounterOperationMetadataV1Alpha--;
 }
 
-buildUnnamed2695() {
+buildUnnamed2688() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2695(core.List<core.String> o) {
+checkUnnamed2688(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1102,7 +1427,7 @@
     o.method = "foo";
     o.target = "foo";
     o.user = "foo";
-    o.warning = buildUnnamed2695();
+    o.warning = buildUnnamed2688();
   }
   buildCounterOperationMetadataV1Beta--;
   return o;
@@ -1117,7 +1442,7 @@
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2695(o.warning);
+    checkUnnamed2688(o.warning);
   }
   buildCounterOperationMetadataV1Beta--;
 }
@@ -1184,16 +1509,14 @@
 buildRepairApplicationRequest() {
   var o = new api.RepairApplicationRequest();
   buildCounterRepairApplicationRequest++;
-  if (buildCounterRepairApplicationRequest < 3) {
-  }
+  if (buildCounterRepairApplicationRequest < 3) {}
   buildCounterRepairApplicationRequest--;
   return o;
 }
 
 checkRepairApplicationRequest(api.RepairApplicationRequest o) {
   buildCounterRepairApplicationRequest++;
-  if (buildCounterRepairApplicationRequest < 3) {
-  }
+  if (buildCounterRepairApplicationRequest < 3) {}
   buildCounterRepairApplicationRequest--;
 }
 
@@ -1218,14 +1541,37 @@
   buildCounterRequestUtilization--;
 }
 
-buildUnnamed2696() {
+core.int buildCounterResourceRecord = 0;
+buildResourceRecord() {
+  var o = new api.ResourceRecord();
+  buildCounterResourceRecord++;
+  if (buildCounterResourceRecord < 3) {
+    o.name = "foo";
+    o.rrdata = "foo";
+    o.type = "foo";
+  }
+  buildCounterResourceRecord--;
+  return o;
+}
+
+checkResourceRecord(api.ResourceRecord o) {
+  buildCounterResourceRecord++;
+  if (buildCounterResourceRecord < 3) {
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.rrdata, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterResourceRecord--;
+}
+
+buildUnnamed2689() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed2696(core.List<api.Volume> o) {
+checkUnnamed2689(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -1239,7 +1585,7 @@
     o.cpu = 42.0;
     o.diskGb = 42.0;
     o.memoryGb = 42.0;
-    o.volumes = buildUnnamed2696();
+    o.volumes = buildUnnamed2689();
   }
   buildCounterResources--;
   return o;
@@ -1251,7 +1597,7 @@
     unittest.expect(o.cpu, unittest.equals(42.0));
     unittest.expect(o.diskGb, unittest.equals(42.0));
     unittest.expect(o.memoryGb, unittest.equals(42.0));
-    checkUnnamed2696(o.volumes);
+    checkUnnamed2689(o.volumes);
   }
   buildCounterResources--;
 }
@@ -1298,14 +1644,33 @@
   buildCounterService--;
 }
 
-buildUnnamed2697() {
+core.int buildCounterSslSettings = 0;
+buildSslSettings() {
+  var o = new api.SslSettings();
+  buildCounterSslSettings++;
+  if (buildCounterSslSettings < 3) {
+    o.certificateId = "foo";
+  }
+  buildCounterSslSettings--;
+  return o;
+}
+
+checkSslSettings(api.SslSettings o) {
+  buildCounterSslSettings++;
+  if (buildCounterSslSettings < 3) {
+    unittest.expect(o.certificateId, unittest.equals('foo'));
+  }
+  buildCounterSslSettings--;
+}
+
+buildUnnamed2690() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2697(core.Map<core.String, core.String> o) {
+checkUnnamed2690(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1318,7 +1683,7 @@
   if (buildCounterStaticFilesHandler < 3) {
     o.applicationReadable = true;
     o.expiration = "foo";
-    o.httpHeaders = buildUnnamed2697();
+    o.httpHeaders = buildUnnamed2690();
     o.mimeType = "foo";
     o.path = "foo";
     o.requireMatchingFile = true;
@@ -1333,7 +1698,7 @@
   if (buildCounterStaticFilesHandler < 3) {
     unittest.expect(o.applicationReadable, unittest.isTrue);
     unittest.expect(o.expiration, unittest.equals('foo'));
-    checkUnnamed2697(o.httpHeaders);
+    checkUnnamed2690(o.httpHeaders);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.requireMatchingFile, unittest.isTrue);
@@ -1342,30 +1707,46 @@
   buildCounterStaticFilesHandler--;
 }
 
-buildUnnamed2698() {
+buildUnnamed2691() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2698(core.Map<core.String, core.Object> o) {
+checkUnnamed2691(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2699() {
+buildUnnamed2692() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2698());
-  o.add(buildUnnamed2698());
+  o.add(buildUnnamed2691());
+  o.add(buildUnnamed2691());
   return o;
 }
 
-checkUnnamed2699(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2692(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2698(o[0]);
-  checkUnnamed2698(o[1]);
+  checkUnnamed2691(o[0]);
+  checkUnnamed2691(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1374,7 +1755,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2699();
+    o.details = buildUnnamed2692();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1385,20 +1766,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2699(o.details);
+    checkUnnamed2692(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed2700() {
+buildUnnamed2693() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed2700(core.Map<core.String, core.double> o) {
+checkUnnamed2693(core.Map<core.String, core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42.0));
   unittest.expect(o["y"], unittest.equals(42.0));
@@ -1409,7 +1790,7 @@
   var o = new api.TrafficSplit();
   buildCounterTrafficSplit++;
   if (buildCounterTrafficSplit < 3) {
-    o.allocations = buildUnnamed2700();
+    o.allocations = buildUnnamed2693();
     o.shardBy = "foo";
   }
   buildCounterTrafficSplit--;
@@ -1419,7 +1800,7 @@
 checkTrafficSplit(api.TrafficSplit o) {
   buildCounterTrafficSplit++;
   if (buildCounterTrafficSplit < 3) {
-    checkUnnamed2700(o.allocations);
+    checkUnnamed2693(o.allocations);
     unittest.expect(o.shardBy, unittest.equals('foo'));
   }
   buildCounterTrafficSplit--;
@@ -1481,79 +1862,79 @@
   buildCounterUrlMap--;
 }
 
-buildUnnamed2701() {
+buildUnnamed2694() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2701(core.Map<core.String, core.String> o) {
+checkUnnamed2694(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2702() {
+buildUnnamed2695() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2702(core.Map<core.String, core.String> o) {
+checkUnnamed2695(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2703() {
+buildUnnamed2696() {
   var o = new core.List<api.ErrorHandler>();
   o.add(buildErrorHandler());
   o.add(buildErrorHandler());
   return o;
 }
 
-checkUnnamed2703(core.List<api.ErrorHandler> o) {
+checkUnnamed2696(core.List<api.ErrorHandler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorHandler(o[0]);
   checkErrorHandler(o[1]);
 }
 
-buildUnnamed2704() {
+buildUnnamed2697() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed2704(core.List<api.UrlMap> o) {
+checkUnnamed2697(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
 }
 
-buildUnnamed2705() {
+buildUnnamed2698() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2705(core.List<core.String> o) {
+checkUnnamed2698(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2706() {
+buildUnnamed2699() {
   var o = new core.List<api.Library>();
   o.add(buildLibrary());
   o.add(buildLibrary());
   return o;
 }
 
-checkUnnamed2706(core.List<api.Library> o) {
+checkUnnamed2699(core.List<api.Library> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLibrary(o[0]);
   checkLibrary(o[1]);
@@ -1567,7 +1948,7 @@
     o.apiConfig = buildApiConfigHandler();
     o.automaticScaling = buildAutomaticScaling();
     o.basicScaling = buildBasicScaling();
-    o.betaSettings = buildUnnamed2701();
+    o.betaSettings = buildUnnamed2694();
     o.createTime = "foo";
     o.createdBy = "foo";
     o.defaultExpiration = "foo";
@@ -1575,14 +1956,14 @@
     o.diskUsageBytes = "foo";
     o.endpointsApiService = buildEndpointsApiService();
     o.env = "foo";
-    o.envVariables = buildUnnamed2702();
-    o.errorHandlers = buildUnnamed2703();
-    o.handlers = buildUnnamed2704();
+    o.envVariables = buildUnnamed2695();
+    o.errorHandlers = buildUnnamed2696();
+    o.handlers = buildUnnamed2697();
     o.healthCheck = buildHealthCheck();
     o.id = "foo";
-    o.inboundServices = buildUnnamed2705();
+    o.inboundServices = buildUnnamed2698();
     o.instanceClass = "foo";
-    o.libraries = buildUnnamed2706();
+    o.libraries = buildUnnamed2699();
     o.livenessCheck = buildLivenessCheck();
     o.manualScaling = buildManualScaling();
     o.name = "foo";
@@ -1607,7 +1988,7 @@
     checkApiConfigHandler(o.apiConfig);
     checkAutomaticScaling(o.automaticScaling);
     checkBasicScaling(o.basicScaling);
-    checkUnnamed2701(o.betaSettings);
+    checkUnnamed2694(o.betaSettings);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.createdBy, unittest.equals('foo'));
     unittest.expect(o.defaultExpiration, unittest.equals('foo'));
@@ -1615,14 +1996,14 @@
     unittest.expect(o.diskUsageBytes, unittest.equals('foo'));
     checkEndpointsApiService(o.endpointsApiService);
     unittest.expect(o.env, unittest.equals('foo'));
-    checkUnnamed2702(o.envVariables);
-    checkUnnamed2703(o.errorHandlers);
-    checkUnnamed2704(o.handlers);
+    checkUnnamed2695(o.envVariables);
+    checkUnnamed2696(o.errorHandlers);
+    checkUnnamed2697(o.handlers);
     checkHealthCheck(o.healthCheck);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2705(o.inboundServices);
+    checkUnnamed2698(o.inboundServices);
     unittest.expect(o.instanceClass, unittest.equals('foo'));
-    checkUnnamed2706(o.libraries);
+    checkUnnamed2699(o.libraries);
     checkLivenessCheck(o.livenessCheck);
     checkManualScaling(o.manualScaling);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1684,7 +2065,6 @@
   buildCounterZipInfo--;
 }
 
-
 main() {
   unittest.group("obj-schema-ApiConfigHandler", () {
     unittest.test("to-json--from-json", () {
@@ -1694,7 +2074,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApiEndpointHandler", () {
     unittest.test("to-json--from-json", () {
       var o = buildApiEndpointHandler();
@@ -1703,7 +2082,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Application", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplication();
@@ -1712,6 +2090,21 @@
     });
   });
 
+  unittest.group("obj-schema-AuthorizedCertificate", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAuthorizedCertificate();
+      var od = new api.AuthorizedCertificate.fromJson(o.toJson());
+      checkAuthorizedCertificate(od);
+    });
+  });
+
+  unittest.group("obj-schema-AuthorizedDomain", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAuthorizedDomain();
+      var od = new api.AuthorizedDomain.fromJson(o.toJson());
+      checkAuthorizedDomain(od);
+    });
+  });
 
   unittest.group("obj-schema-AutomaticScaling", () {
     unittest.test("to-json--from-json", () {
@@ -1721,7 +2114,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BasicScaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildBasicScaling();
@@ -1730,6 +2122,13 @@
     });
   });
 
+  unittest.group("obj-schema-CertificateRawData", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCertificateRawData();
+      var od = new api.CertificateRawData.fromJson(o.toJson());
+      checkCertificateRawData(od);
+    });
+  });
 
   unittest.group("obj-schema-ContainerInfo", () {
     unittest.test("to-json--from-json", () {
@@ -1739,7 +2138,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CpuUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildCpuUtilization();
@@ -1748,7 +2146,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DebugInstanceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDebugInstanceRequest();
@@ -1757,7 +2154,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Deployment", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeployment();
@@ -1766,7 +2162,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskUtilization();
@@ -1775,6 +2170,21 @@
     });
   });
 
+  unittest.group("obj-schema-DomainMapping", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDomainMapping();
+      var od = new api.DomainMapping.fromJson(o.toJson());
+      checkDomainMapping(od);
+    });
+  });
+
+  unittest.group("obj-schema-Empty", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEmpty();
+      var od = new api.Empty.fromJson(o.toJson());
+      checkEmpty(od);
+    });
+  });
 
   unittest.group("obj-schema-EndpointsApiService", () {
     unittest.test("to-json--from-json", () {
@@ -1784,7 +2194,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ErrorHandler", () {
     unittest.test("to-json--from-json", () {
       var o = buildErrorHandler();
@@ -1793,6 +2202,13 @@
     });
   });
 
+  unittest.group("obj-schema-FeatureSettings", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFeatureSettings();
+      var od = new api.FeatureSettings.fromJson(o.toJson());
+      checkFeatureSettings(od);
+    });
+  });
 
   unittest.group("obj-schema-FileInfo", () {
     unittest.test("to-json--from-json", () {
@@ -1802,7 +2218,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildHealthCheck();
@@ -1811,7 +2226,6 @@
     });
   });
 
-
   unittest.group("obj-schema-IdentityAwareProxy", () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentityAwareProxy();
@@ -1820,7 +2234,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Instance", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstance();
@@ -1829,7 +2242,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Library", () {
     unittest.test("to-json--from-json", () {
       var o = buildLibrary();
@@ -1838,6 +2250,29 @@
     });
   });
 
+  unittest.group("obj-schema-ListAuthorizedCertificatesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListAuthorizedCertificatesResponse();
+      var od = new api.ListAuthorizedCertificatesResponse.fromJson(o.toJson());
+      checkListAuthorizedCertificatesResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-ListAuthorizedDomainsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListAuthorizedDomainsResponse();
+      var od = new api.ListAuthorizedDomainsResponse.fromJson(o.toJson());
+      checkListAuthorizedDomainsResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-ListDomainMappingsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListDomainMappingsResponse();
+      var od = new api.ListDomainMappingsResponse.fromJson(o.toJson());
+      checkListDomainMappingsResponse(od);
+    });
+  });
 
   unittest.group("obj-schema-ListInstancesResponse", () {
     unittest.test("to-json--from-json", () {
@@ -1847,7 +2282,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListLocationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListLocationsResponse();
@@ -1856,7 +2290,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -1865,7 +2298,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListServicesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListServicesResponse();
@@ -1874,7 +2306,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListVersionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListVersionsResponse();
@@ -1883,7 +2314,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LivenessCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildLivenessCheck();
@@ -1892,7 +2322,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Location", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocation();
@@ -1901,7 +2330,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocationMetadata();
@@ -1910,7 +2338,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManualScaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildManualScaling();
@@ -1919,7 +2346,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Network", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetwork();
@@ -1928,7 +2354,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkUtilization();
@@ -1937,7 +2362,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1946,7 +2370,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadata();
@@ -1955,7 +2378,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadataExperimental", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadataExperimental();
@@ -1964,7 +2386,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadataV1", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadataV1();
@@ -1973,7 +2394,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadataV1Alpha", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadataV1Alpha();
@@ -1982,7 +2402,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadataV1Beta", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadataV1Beta();
@@ -1991,7 +2410,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadataV1Beta5", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadataV1Beta5();
@@ -2000,7 +2418,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadinessCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadinessCheck();
@@ -2009,7 +2426,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RepairApplicationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRepairApplicationRequest();
@@ -2018,7 +2434,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RequestUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildRequestUtilization();
@@ -2027,6 +2442,13 @@
     });
   });
 
+  unittest.group("obj-schema-ResourceRecord", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildResourceRecord();
+      var od = new api.ResourceRecord.fromJson(o.toJson());
+      checkResourceRecord(od);
+    });
+  });
 
   unittest.group("obj-schema-Resources", () {
     unittest.test("to-json--from-json", () {
@@ -2036,7 +2458,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ScriptHandler", () {
     unittest.test("to-json--from-json", () {
       var o = buildScriptHandler();
@@ -2045,7 +2466,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Service", () {
     unittest.test("to-json--from-json", () {
       var o = buildService();
@@ -2054,6 +2474,13 @@
     });
   });
 
+  unittest.group("obj-schema-SslSettings", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSslSettings();
+      var od = new api.SslSettings.fromJson(o.toJson());
+      checkSslSettings(od);
+    });
+  });
 
   unittest.group("obj-schema-StaticFilesHandler", () {
     unittest.test("to-json--from-json", () {
@@ -2063,7 +2490,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -2072,7 +2498,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TrafficSplit", () {
     unittest.test("to-json--from-json", () {
       var o = buildTrafficSplit();
@@ -2081,7 +2506,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlDispatchRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlDispatchRule();
@@ -2090,7 +2514,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMap", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMap();
@@ -2099,7 +2522,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Version", () {
     unittest.test("to-json--from-json", () {
       var o = buildVersion();
@@ -2108,7 +2530,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Volume", () {
     unittest.test("to-json--from-json", () {
       var o = buildVolume();
@@ -2117,7 +2538,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ZipInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildZipInfo();
@@ -2126,10 +2546,8 @@
     });
   });
 
-
   unittest.group("resource-AppsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.AppsResourceApi res = new api.AppengineApi(mock).apps;
       var arg_request = buildApplication();
@@ -2141,9 +2559,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("v1/apps"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("v1/apps"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2156,27 +2576,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AppsResourceApi res = new api.AppengineApi(mock).apps;
       var arg_appsId = "foo";
@@ -2185,9 +2607,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2203,27 +2627,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApplication());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_appsId).then(unittest.expectAsync1(((api.Application response) {
+      res
+          .get(arg_appsId)
+          .then(unittest.expectAsync1(((api.Application response) {
         checkApplication(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.AppsResourceApi res = new api.AppengineApi(mock).apps;
       var arg_request = buildApplication();
@@ -2237,9 +2663,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2255,28 +2683,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_appsId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_appsId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--repair", () {
-
       var mock = new HttpServerMock();
       api.AppsResourceApi res = new api.AppengineApi(mock).apps;
       var arg_request = buildRepairApplicationRequest();
@@ -2289,16 +2720,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf(":repair", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":repair"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":repair"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2311,33 +2746,756 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.repair(arg_request, arg_appsId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .repair(arg_request, arg_appsId)
+          .then(unittest.expectAsync1(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-AppsAuthorizedCertificatesResourceApi", () {
+    unittest.test("method--create", () {
+      var mock = new HttpServerMock();
+      api.AppsAuthorizedCertificatesResourceApi res =
+          new api.AppengineApi(mock).apps.authorizedCertificates;
+      var arg_request = buildAuthorizedCertificate();
+      var arg_appsId = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.AuthorizedCertificate.fromJson(json);
+        checkAuthorizedCertificate(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/authorizedCertificates", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("/authorizedCertificates"));
+        pathOffset += 23;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildAuthorizedCertificate());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_appsId)
+          .then(unittest.expectAsync1(((api.AuthorizedCertificate response) {
+        checkAuthorizedCertificate(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.AppsAuthorizedCertificatesResourceApi res =
+          new api.AppengineApi(mock).apps.authorizedCertificates;
+      var arg_appsId = "foo";
+      var arg_authorizedCertificatesId = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/authorizedCertificates/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("/authorizedCertificates/"));
+        pathOffset += 24;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(
+            subPart, unittest.equals("$arg_authorizedCertificatesId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .delete(arg_appsId, arg_authorizedCertificatesId)
+          .then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.AppsAuthorizedCertificatesResourceApi res =
+          new api.AppengineApi(mock).apps.authorizedCertificates;
+      var arg_appsId = "foo";
+      var arg_authorizedCertificatesId = "foo";
+      var arg_view = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/authorizedCertificates/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("/authorizedCertificates/"));
+        pathOffset += 24;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(
+            subPart, unittest.equals("$arg_authorizedCertificatesId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildAuthorizedCertificate());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_appsId, arg_authorizedCertificatesId, view: arg_view)
+          .then(unittest.expectAsync1(((api.AuthorizedCertificate response) {
+        checkAuthorizedCertificate(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.AppsAuthorizedCertificatesResourceApi res =
+          new api.AppengineApi(mock).apps.authorizedCertificates;
+      var arg_appsId = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      var arg_view = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/authorizedCertificates", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("/authorizedCertificates"));
+        pathOffset += 23;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp =
+            convert.JSON.encode(buildListAuthorizedCertificatesResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_appsId,
+              pageToken: arg_pageToken, pageSize: arg_pageSize, view: arg_view)
+          .then(unittest
+              .expectAsync1(((api.ListAuthorizedCertificatesResponse response) {
+        checkListAuthorizedCertificatesResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.AppsAuthorizedCertificatesResourceApi res =
+          new api.AppengineApi(mock).apps.authorizedCertificates;
+      var arg_request = buildAuthorizedCertificate();
+      var arg_appsId = "foo";
+      var arg_authorizedCertificatesId = "foo";
+      var arg_updateMask = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.AuthorizedCertificate.fromJson(json);
+        checkAuthorizedCertificate(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/authorizedCertificates/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("/authorizedCertificates/"));
+        pathOffset += 24;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(
+            subPart, unittest.equals("$arg_authorizedCertificatesId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildAuthorizedCertificate());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_appsId, arg_authorizedCertificatesId,
+              updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.AuthorizedCertificate response) {
+        checkAuthorizedCertificate(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-AppsAuthorizedDomainsResourceApi", () {
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.AppsAuthorizedDomainsResourceApi res =
+          new api.AppengineApi(mock).apps.authorizedDomains;
+      var arg_appsId = "foo";
+      var arg_pageSize = 42;
+      var arg_pageToken = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/authorizedDomains", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("/authorizedDomains"));
+        pathOffset += 18;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListAuthorizedDomainsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_appsId, pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.ListAuthorizedDomainsResponse response) {
+        checkListAuthorizedDomainsResponse(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-AppsDomainMappingsResourceApi", () {
+    unittest.test("method--create", () {
+      var mock = new HttpServerMock();
+      api.AppsDomainMappingsResourceApi res =
+          new api.AppengineApi(mock).apps.domainMappings;
+      var arg_request = buildDomainMapping();
+      var arg_appsId = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.DomainMapping.fromJson(json);
+        checkDomainMapping(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/domainMappings", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/domainMappings"));
+        pathOffset += 15;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperation());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_appsId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
-  });
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.AppsDomainMappingsResourceApi res =
+          new api.AppengineApi(mock).apps.domainMappings;
+      var arg_appsId = "foo";
+      var arg_domainMappingsId = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/domainMappings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/domainMappings/"));
+        pathOffset += 16;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_domainMappingsId"));
 
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperation());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .delete(arg_appsId, arg_domainMappingsId)
+          .then(unittest.expectAsync1(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.AppsDomainMappingsResourceApi res =
+          new api.AppengineApi(mock).apps.domainMappings;
+      var arg_appsId = "foo";
+      var arg_domainMappingsId = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/domainMappings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/domainMappings/"));
+        pathOffset += 16;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_domainMappingsId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildDomainMapping());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_appsId, arg_domainMappingsId)
+          .then(unittest.expectAsync1(((api.DomainMapping response) {
+        checkDomainMapping(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.AppsDomainMappingsResourceApi res =
+          new api.AppengineApi(mock).apps.domainMappings;
+      var arg_appsId = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/domainMappings", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/domainMappings"));
+        pathOffset += 15;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListDomainMappingsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_appsId, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(
+              unittest.expectAsync1(((api.ListDomainMappingsResponse response) {
+        checkListDomainMappingsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.AppsDomainMappingsResourceApi res =
+          new api.AppengineApi(mock).apps.domainMappings;
+      var arg_request = buildDomainMapping();
+      var arg_appsId = "foo";
+      var arg_domainMappingsId = "foo";
+      var arg_updateMask = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.DomainMapping.fromJson(json);
+        checkDomainMapping(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
+        pathOffset += 8;
+        index = path.indexOf("/domainMappings/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_appsId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/domainMappings/"));
+        pathOffset += 16;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_domainMappingsId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperation());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_appsId, arg_domainMappingsId,
+              updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+  });
 
   unittest.group("resource-AppsLocationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AppsLocationsResourceApi res = new api.AppengineApi(mock).apps.locations;
+      api.AppsLocationsResourceApi res =
+          new api.AppengineApi(mock).apps.locations;
       var arg_appsId = "foo";
       var arg_locationsId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2345,16 +3503,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/locations/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/locations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/locations/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2370,48 +3532,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLocation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_appsId, arg_locationsId).then(unittest.expectAsync1(((api.Location response) {
+      res
+          .get(arg_appsId, arg_locationsId)
+          .then(unittest.expectAsync1(((api.Location response) {
         checkLocation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AppsLocationsResourceApi res = new api.AppengineApi(mock).apps.locations;
+      api.AppsLocationsResourceApi res =
+          new api.AppengineApi(mock).apps.locations;
       var arg_appsId = "foo";
+      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
-      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/locations", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/locations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/locations"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2424,36 +3593,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLocationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_appsId, pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListLocationsResponse response) {
+      res
+          .list(arg_appsId,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AppsOperationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AppsOperationsResourceApi res = new api.AppengineApi(mock).apps.operations;
+      api.AppsOperationsResourceApi res =
+          new api.AppengineApi(mock).apps.operations;
       var arg_appsId = "foo";
       var arg_operationsId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2461,16 +3636,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/operations/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/operations/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2486,29 +3665,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_appsId, arg_operationsId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .get(arg_appsId, arg_operationsId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AppsOperationsResourceApi res = new api.AppengineApi(mock).apps.operations;
+      api.AppsOperationsResourceApi res =
+          new api.AppengineApi(mock).apps.operations;
       var arg_appsId = "foo";
       var arg_filter = "foo";
       var arg_pageToken = "foo";
@@ -2518,16 +3700,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/operations", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/operations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/operations"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -2540,36 +3726,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_appsId, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_appsId,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AppsServicesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesResourceApi res = new api.AppengineApi(mock).apps.services;
+      api.AppsServicesResourceApi res =
+          new api.AppengineApi(mock).apps.services;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2577,16 +3769,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2602,29 +3798,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_appsId, arg_servicesId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_appsId, arg_servicesId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesResourceApi res = new api.AppengineApi(mock).apps.services;
+      api.AppsServicesResourceApi res =
+          new api.AppengineApi(mock).apps.services;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2632,16 +3831,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2657,29 +3860,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_appsId, arg_servicesId).then(unittest.expectAsync1(((api.Service response) {
+      res
+          .get(arg_appsId, arg_servicesId)
+          .then(unittest.expectAsync1(((api.Service response) {
         checkService(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesResourceApi res = new api.AppengineApi(mock).apps.services;
+      api.AppsServicesResourceApi res =
+          new api.AppengineApi(mock).apps.services;
       var arg_appsId = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2688,16 +3894,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/services"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/services"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2710,36 +3920,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListServicesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_appsId, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListServicesResponse response) {
+      res
+          .list(arg_appsId, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListServicesResponse response) {
         checkListServicesResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesResourceApi res = new api.AppengineApi(mock).apps.services;
+      api.AppsServicesResourceApi res =
+          new api.AppengineApi(mock).apps.services;
       var arg_request = buildService();
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
-      var arg_migrateTraffic = true;
       var arg_updateMask = "foo";
+      var arg_migrateTraffic = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Service.fromJson(json);
         checkService(obj);
@@ -2748,16 +3963,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2773,35 +3992,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["migrateTraffic"].first, unittest.equals("$arg_migrateTraffic"));
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["migrateTraffic"].first,
+            unittest.equals("$arg_migrateTraffic"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_appsId, arg_servicesId, migrateTraffic: arg_migrateTraffic, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_appsId, arg_servicesId,
+              updateMask: arg_updateMask, migrateTraffic: arg_migrateTraffic)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AppsServicesVersionsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsResourceApi res = new api.AppengineApi(mock).apps.services.versions;
+      api.AppsServicesVersionsResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions;
       var arg_request = buildVersion();
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
@@ -2813,23 +4036,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/versions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/versions"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2842,29 +4071,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_appsId, arg_servicesId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_appsId, arg_servicesId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsResourceApi res = new api.AppengineApi(mock).apps.services.versions;
+      api.AppsServicesVersionsResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       var arg_versionsId = "foo";
@@ -2873,23 +4105,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2905,29 +4143,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_appsId, arg_servicesId, arg_versionsId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_appsId, arg_servicesId, arg_versionsId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsResourceApi res = new api.AppengineApi(mock).apps.services.versions;
+      api.AppsServicesVersionsResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       var arg_versionsId = "foo";
@@ -2937,23 +4178,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2969,30 +4216,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVersion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_appsId, arg_servicesId, arg_versionsId, view: arg_view).then(unittest.expectAsync1(((api.Version response) {
+      res
+          .get(arg_appsId, arg_servicesId, arg_versionsId, view: arg_view)
+          .then(unittest.expectAsync1(((api.Version response) {
         checkVersion(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsResourceApi res = new api.AppengineApi(mock).apps.services.versions;
+      api.AppsServicesVersionsResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       var arg_pageToken = "foo";
@@ -3003,23 +4253,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/versions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/versions"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3032,32 +4288,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListVersionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_appsId, arg_servicesId, pageToken: arg_pageToken, pageSize: arg_pageSize, view: arg_view).then(unittest.expectAsync1(((api.ListVersionsResponse response) {
+      res
+          .list(arg_appsId, arg_servicesId,
+              pageToken: arg_pageToken, pageSize: arg_pageSize, view: arg_view)
+          .then(unittest.expectAsync1(((api.ListVersionsResponse response) {
         checkListVersionsResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsResourceApi res = new api.AppengineApi(mock).apps.services.versions;
+      api.AppsServicesVersionsResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions;
       var arg_request = buildVersion();
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
@@ -3071,23 +4333,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3103,34 +4371,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_appsId, arg_servicesId, arg_versionsId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_appsId, arg_servicesId, arg_versionsId,
+              updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AppsServicesVersionsInstancesResourceApi", () {
     unittest.test("method--debug", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsInstancesResourceApi res = new api.AppengineApi(mock).apps.services.versions.instances;
+      api.AppsServicesVersionsInstancesResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions.instances;
       var arg_request = buildDebugInstanceRequest();
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
@@ -3144,37 +4415,47 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         index = path.indexOf("/instances/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_versionsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/instances/"));
         pathOffset += 11;
         index = path.indexOf(":debug", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_instancesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals(":debug"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals(":debug"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -3187,29 +4468,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.debug(arg_request, arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .debug(arg_request, arg_appsId, arg_servicesId, arg_versionsId,
+              arg_instancesId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsInstancesResourceApi res = new api.AppengineApi(mock).apps.services.versions.instances;
+      api.AppsServicesVersionsInstancesResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions.instances;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       var arg_versionsId = "foo";
@@ -3219,30 +4504,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         index = path.indexOf("/instances/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_versionsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/instances/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3258,29 +4551,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsInstancesResourceApi res = new api.AppengineApi(mock).apps.services.versions.instances;
+      api.AppsServicesVersionsInstancesResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions.instances;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       var arg_versionsId = "foo";
@@ -3290,30 +4586,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         index = path.indexOf("/instances/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_versionsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/instances/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3329,29 +4633,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstance());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId).then(unittest.expectAsync1(((api.Instance response) {
+      res
+          .get(arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId)
+          .then(unittest.expectAsync1(((api.Instance response) {
         checkInstance(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AppsServicesVersionsInstancesResourceApi res = new api.AppengineApi(mock).apps.services.versions.instances;
+      api.AppsServicesVersionsInstancesResourceApi res =
+          new api.AppengineApi(mock).apps.services.versions.instances;
       var arg_appsId = "foo";
       var arg_servicesId = "foo";
       var arg_versionsId = "foo";
@@ -3362,30 +4669,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/apps/"));
         pathOffset += 8;
         index = path.indexOf("/services/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_appsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/services/"));
         pathOffset += 10;
         index = path.indexOf("/versions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_servicesId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/versions/"));
         pathOffset += 10;
         index = path.indexOf("/instances", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_versionsId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/instances"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/instances"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -3398,29 +4713,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListInstancesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_appsId, arg_servicesId, arg_versionsId, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListInstancesResponse response) {
+      res
+          .list(arg_appsId, arg_servicesId, arg_versionsId,
+              pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListInstancesResponse response) {
         checkListInstancesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/appsactivity/v1_test.dart b/generated/googleapis/test/appsactivity/v1_test.dart
index 33d8a16..e861704 100644
--- a/generated/googleapis/test/appsactivity/v1_test.dart
+++ b/generated/googleapis/test/appsactivity/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.appsactivity.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/appsactivity/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1096() {
+buildUnnamed1099() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed1096(core.List<api.Event> o) {
+checkUnnamed1099(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -70,7 +69,7 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     o.combinedEvent = buildEvent();
-    o.singleEvents = buildUnnamed1096();
+    o.singleEvents = buildUnnamed1099();
   }
   buildCounterActivity--;
   return o;
@@ -80,32 +79,32 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     checkEvent(o.combinedEvent);
-    checkUnnamed1096(o.singleEvents);
+    checkUnnamed1099(o.singleEvents);
   }
   buildCounterActivity--;
 }
 
-buildUnnamed1097() {
+buildUnnamed1100() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1097(core.List<core.String> o) {
+checkUnnamed1100(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1098() {
+buildUnnamed1101() {
   var o = new core.List<api.PermissionChange>();
   o.add(buildPermissionChange());
   o.add(buildPermissionChange());
   return o;
 }
 
-checkUnnamed1098(core.List<api.PermissionChange> o) {
+checkUnnamed1101(core.List<api.PermissionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionChange(o[0]);
   checkPermissionChange(o[1]);
@@ -116,11 +115,11 @@
   var o = new api.Event();
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    o.additionalEventTypes = buildUnnamed1097();
+    o.additionalEventTypes = buildUnnamed1100();
     o.eventTimeMillis = "foo";
     o.fromUserDeletion = true;
     o.move = buildMove();
-    o.permissionChanges = buildUnnamed1098();
+    o.permissionChanges = buildUnnamed1101();
     o.primaryEventType = "foo";
     o.rename = buildRename();
     o.target = buildTarget();
@@ -133,11 +132,11 @@
 checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkUnnamed1097(o.additionalEventTypes);
+    checkUnnamed1100(o.additionalEventTypes);
     unittest.expect(o.eventTimeMillis, unittest.equals('foo'));
     unittest.expect(o.fromUserDeletion, unittest.isTrue);
     checkMove(o.move);
-    checkUnnamed1098(o.permissionChanges);
+    checkUnnamed1101(o.permissionChanges);
     unittest.expect(o.primaryEventType, unittest.equals('foo'));
     checkRename(o.rename);
     checkTarget(o.target);
@@ -146,14 +145,14 @@
   buildCounterEvent--;
 }
 
-buildUnnamed1099() {
+buildUnnamed1102() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed1099(core.List<api.Activity> o) {
+checkUnnamed1102(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -164,7 +163,7 @@
   var o = new api.ListActivitiesResponse();
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    o.activities = buildUnnamed1099();
+    o.activities = buildUnnamed1102();
     o.nextPageToken = "foo";
   }
   buildCounterListActivitiesResponse--;
@@ -174,33 +173,33 @@
 checkListActivitiesResponse(api.ListActivitiesResponse o) {
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    checkUnnamed1099(o.activities);
+    checkUnnamed1102(o.activities);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListActivitiesResponse--;
 }
 
-buildUnnamed1100() {
+buildUnnamed1103() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed1100(core.List<api.Parent> o) {
+checkUnnamed1103(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
 }
 
-buildUnnamed1101() {
+buildUnnamed1104() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed1101(core.List<api.Parent> o) {
+checkUnnamed1104(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -211,8 +210,8 @@
   var o = new api.Move();
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    o.addedParents = buildUnnamed1100();
-    o.removedParents = buildUnnamed1101();
+    o.addedParents = buildUnnamed1103();
+    o.removedParents = buildUnnamed1104();
   }
   buildCounterMove--;
   return o;
@@ -221,8 +220,8 @@
 checkMove(api.Move o) {
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    checkUnnamed1100(o.addedParents);
-    checkUnnamed1101(o.removedParents);
+    checkUnnamed1103(o.addedParents);
+    checkUnnamed1104(o.removedParents);
   }
   buildCounterMove--;
 }
@@ -279,27 +278,27 @@
   buildCounterPermission--;
 }
 
-buildUnnamed1102() {
+buildUnnamed1105() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1102(core.List<api.Permission> o) {
+checkUnnamed1105(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed1103() {
+buildUnnamed1106() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1103(core.List<api.Permission> o) {
+checkUnnamed1106(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -310,8 +309,8 @@
   var o = new api.PermissionChange();
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    o.addedPermissions = buildUnnamed1102();
-    o.removedPermissions = buildUnnamed1103();
+    o.addedPermissions = buildUnnamed1105();
+    o.removedPermissions = buildUnnamed1106();
   }
   buildCounterPermissionChange--;
   return o;
@@ -320,8 +319,8 @@
 checkPermissionChange(api.PermissionChange o) {
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    checkUnnamed1102(o.addedPermissions);
-    checkUnnamed1103(o.removedPermissions);
+    checkUnnamed1105(o.addedPermissions);
+    checkUnnamed1106(o.removedPermissions);
   }
   buildCounterPermissionChange--;
 }
@@ -416,7 +415,6 @@
   buildCounterUser--;
 }
 
-
 main() {
   unittest.group("obj-schema-Activity", () {
     unittest.test("to-json--from-json", () {
@@ -426,7 +424,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Event", () {
     unittest.test("to-json--from-json", () {
       var o = buildEvent();
@@ -435,7 +432,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListActivitiesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListActivitiesResponse();
@@ -444,7 +440,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Move", () {
     unittest.test("to-json--from-json", () {
       var o = buildMove();
@@ -453,7 +448,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Parent", () {
     unittest.test("to-json--from-json", () {
       var o = buildParent();
@@ -462,7 +456,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Permission", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermission();
@@ -471,7 +464,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionChange", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionChange();
@@ -480,7 +472,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Photo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPhoto();
@@ -489,7 +480,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Rename", () {
     unittest.test("to-json--from-json", () {
       var o = buildRename();
@@ -498,7 +488,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Target", () {
     unittest.test("to-json--from-json", () {
       var o = buildTarget();
@@ -507,7 +496,6 @@
     });
   });
 
-
   unittest.group("obj-schema-User", () {
     unittest.test("to-json--from-json", () {
       var o = buildUser();
@@ -516,10 +504,8 @@
     });
   });
 
-
   unittest.group("resource-ActivitiesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.AppsactivityApi(mock).activities;
       var arg_drive_ancestorId = "foo";
@@ -534,11 +520,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("appsactivity/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("appsactivity/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("activities"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -551,34 +540,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["drive.ancestorId"].first, unittest.equals(arg_drive_ancestorId));
-        unittest.expect(queryMap["drive.fileId"].first, unittest.equals(arg_drive_fileId));
-        unittest.expect(queryMap["groupingStrategy"].first, unittest.equals(arg_groupingStrategy));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["drive.ancestorId"].first,
+            unittest.equals(arg_drive_ancestorId));
+        unittest.expect(
+            queryMap["drive.fileId"].first, unittest.equals(arg_drive_fileId));
+        unittest.expect(queryMap["groupingStrategy"].first,
+            unittest.equals(arg_groupingStrategy));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["source"].first, unittest.equals(arg_source));
         unittest.expect(queryMap["userId"].first, unittest.equals(arg_userId));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListActivitiesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(drive_ancestorId: arg_drive_ancestorId, drive_fileId: arg_drive_fileId, groupingStrategy: arg_groupingStrategy, pageSize: arg_pageSize, pageToken: arg_pageToken, source: arg_source, userId: arg_userId).then(unittest.expectAsync1(((api.ListActivitiesResponse response) {
+      res
+          .list(
+              drive_ancestorId: arg_drive_ancestorId,
+              drive_fileId: arg_drive_fileId,
+              groupingStrategy: arg_groupingStrategy,
+              pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
+              source: arg_source,
+              userId: arg_userId)
+          .then(unittest.expectAsync1(((api.ListActivitiesResponse response) {
         checkListActivitiesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/appstate/v1_test.dart b/generated/googleapis/test/appstate/v1_test.dart
index a2b4172..2c09978 100644
--- a/generated/googleapis/test/appstate/v1_test.dart
+++ b/generated/googleapis/test/appstate/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.appstate.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/appstate/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -76,14 +75,14 @@
   buildCounterGetResponse--;
 }
 
-buildUnnamed2515() {
+buildUnnamed2502() {
   var o = new core.List<api.GetResponse>();
   o.add(buildGetResponse());
   o.add(buildGetResponse());
   return o;
 }
 
-checkUnnamed2515(core.List<api.GetResponse> o) {
+checkUnnamed2502(core.List<api.GetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGetResponse(o[0]);
   checkGetResponse(o[1]);
@@ -94,7 +93,7 @@
   var o = new api.ListResponse();
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    o.items = buildUnnamed2515();
+    o.items = buildUnnamed2502();
     o.kind = "foo";
     o.maximumKeyCount = 42;
   }
@@ -105,7 +104,7 @@
 checkListResponse(api.ListResponse o) {
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    checkUnnamed2515(o.items);
+    checkUnnamed2502(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maximumKeyCount, unittest.equals(42));
   }
@@ -156,7 +155,6 @@
   buildCounterWriteResult--;
 }
 
-
 main() {
   unittest.group("obj-schema-GetResponse", () {
     unittest.test("to-json--from-json", () {
@@ -166,7 +164,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListResponse();
@@ -175,7 +172,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateRequest();
@@ -184,7 +180,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WriteResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildWriteResult();
@@ -193,10 +188,8 @@
     });
   });
 
-
   unittest.group("resource-StatesResourceApi", () {
     unittest.test("method--clear", () {
-
       var mock = new HttpServerMock();
       api.StatesResourceApi res = new api.AppstateApi(mock).states;
       var arg_stateKey = 42;
@@ -206,18 +199,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("appstate/v1/"));
         pathOffset += 12;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("states/"));
         pathOffset += 7;
         index = path.indexOf("/clear", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_stateKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/clear"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/clear"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -230,28 +228,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["currentDataVersion"].first, unittest.equals(arg_currentDataVersion));
-
+        unittest.expect(queryMap["currentDataVersion"].first,
+            unittest.equals(arg_currentDataVersion));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWriteResult());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.clear(arg_stateKey, currentDataVersion: arg_currentDataVersion).then(unittest.expectAsync1(((api.WriteResult response) {
+      res
+          .clear(arg_stateKey, currentDataVersion: arg_currentDataVersion)
+          .then(unittest.expectAsync1(((api.WriteResult response) {
         checkWriteResult(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.StatesResourceApi res = new api.AppstateApi(mock).states;
       var arg_stateKey = 42;
@@ -260,11 +261,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("appstate/v1/"));
         pathOffset += 12;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("states/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -280,16 +284,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -298,7 +303,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.StatesResourceApi res = new api.AppstateApi(mock).states;
       var arg_stateKey = 42;
@@ -307,11 +311,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("appstate/v1/"));
         pathOffset += 12;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("states/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -327,27 +334,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_stateKey).then(unittest.expectAsync1(((api.GetResponse response) {
+      res
+          .get(arg_stateKey)
+          .then(unittest.expectAsync1(((api.GetResponse response) {
         checkGetResponse(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.StatesResourceApi res = new api.AppstateApi(mock).states;
       var arg_includeData = true;
@@ -356,11 +365,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("appstate/v1/"));
         pathOffset += 12;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("states"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("states"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -373,28 +385,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeData"].first, unittest.equals("$arg_includeData"));
-
+        unittest.expect(
+            queryMap["includeData"].first, unittest.equals("$arg_includeData"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(includeData: arg_includeData).then(unittest.expectAsync1(((api.ListResponse response) {
+      res
+          .list(includeData: arg_includeData)
+          .then(unittest.expectAsync1(((api.ListResponse response) {
         checkListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.StatesResourceApi res = new api.AppstateApi(mock).states;
       var arg_request = buildUpdateRequest();
@@ -408,11 +423,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("appstate/v1/"));
         pathOffset += 12;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("states/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -428,28 +446,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["currentStateVersion"].first, unittest.equals(arg_currentStateVersion));
-
+        unittest.expect(queryMap["currentStateVersion"].first,
+            unittest.equals(arg_currentStateVersion));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWriteResult());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_stateKey, currentStateVersion: arg_currentStateVersion).then(unittest.expectAsync1(((api.WriteResult response) {
+      res
+          .update(arg_request, arg_stateKey,
+              currentStateVersion: arg_currentStateVersion)
+          .then(unittest.expectAsync1(((api.WriteResult response) {
         checkWriteResult(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudbilling/v1_test.dart b/generated/googleapis/test/cloudbilling/v1_test.dart
index 527c34e..3423610 100644
--- a/generated/googleapis/test/cloudbilling/v1_test.dart
+++ b/generated/googleapis/test/cloudbilling/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudbilling.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudbilling/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -122,14 +121,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed68() {
+buildUnnamed63() {
   var o = new core.List<api.BillingAccount>();
   o.add(buildBillingAccount());
   o.add(buildBillingAccount());
   return o;
 }
 
-checkUnnamed68(core.List<api.BillingAccount> o) {
+checkUnnamed63(core.List<api.BillingAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingAccount(o[0]);
   checkBillingAccount(o[1]);
@@ -140,7 +139,7 @@
   var o = new api.ListBillingAccountsResponse();
   buildCounterListBillingAccountsResponse++;
   if (buildCounterListBillingAccountsResponse < 3) {
-    o.billingAccounts = buildUnnamed68();
+    o.billingAccounts = buildUnnamed63();
     o.nextPageToken = "foo";
   }
   buildCounterListBillingAccountsResponse--;
@@ -150,20 +149,20 @@
 checkListBillingAccountsResponse(api.ListBillingAccountsResponse o) {
   buildCounterListBillingAccountsResponse++;
   if (buildCounterListBillingAccountsResponse < 3) {
-    checkUnnamed68(o.billingAccounts);
+    checkUnnamed63(o.billingAccounts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListBillingAccountsResponse--;
 }
 
-buildUnnamed69() {
+buildUnnamed64() {
   var o = new core.List<api.ProjectBillingInfo>();
   o.add(buildProjectBillingInfo());
   o.add(buildProjectBillingInfo());
   return o;
 }
 
-checkUnnamed69(core.List<api.ProjectBillingInfo> o) {
+checkUnnamed64(core.List<api.ProjectBillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectBillingInfo(o[0]);
   checkProjectBillingInfo(o[1]);
@@ -175,7 +174,7 @@
   buildCounterListProjectBillingInfoResponse++;
   if (buildCounterListProjectBillingInfoResponse < 3) {
     o.nextPageToken = "foo";
-    o.projectBillingInfo = buildUnnamed69();
+    o.projectBillingInfo = buildUnnamed64();
   }
   buildCounterListProjectBillingInfoResponse--;
   return o;
@@ -185,19 +184,19 @@
   buildCounterListProjectBillingInfoResponse++;
   if (buildCounterListProjectBillingInfoResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed69(o.projectBillingInfo);
+    checkUnnamed64(o.projectBillingInfo);
   }
   buildCounterListProjectBillingInfoResponse--;
 }
 
-buildUnnamed70() {
+buildUnnamed65() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed70(core.List<api.Service> o) {
+checkUnnamed65(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -209,7 +208,7 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed70();
+    o.services = buildUnnamed65();
   }
   buildCounterListServicesResponse--;
   return o;
@@ -219,19 +218,19 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed70(o.services);
+    checkUnnamed65(o.services);
   }
   buildCounterListServicesResponse--;
 }
 
-buildUnnamed71() {
+buildUnnamed66() {
   var o = new core.List<api.Sku>();
   o.add(buildSku());
   o.add(buildSku());
   return o;
 }
 
-checkUnnamed71(core.List<api.Sku> o) {
+checkUnnamed66(core.List<api.Sku> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSku(o[0]);
   checkSku(o[1]);
@@ -243,7 +242,7 @@
   buildCounterListSkusResponse++;
   if (buildCounterListSkusResponse < 3) {
     o.nextPageToken = "foo";
-    o.skus = buildUnnamed71();
+    o.skus = buildUnnamed66();
   }
   buildCounterListSkusResponse--;
   return o;
@@ -253,7 +252,7 @@
   buildCounterListSkusResponse++;
   if (buildCounterListSkusResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed71(o.skus);
+    checkUnnamed66(o.skus);
   }
   buildCounterListSkusResponse--;
 }
@@ -281,14 +280,14 @@
   buildCounterMoney--;
 }
 
-buildUnnamed72() {
+buildUnnamed67() {
   var o = new core.List<api.TierRate>();
   o.add(buildTierRate());
   o.add(buildTierRate());
   return o;
 }
 
-checkUnnamed72(core.List<api.TierRate> o) {
+checkUnnamed67(core.List<api.TierRate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTierRate(o[0]);
   checkTierRate(o[1]);
@@ -303,7 +302,7 @@
     o.baseUnitConversionFactor = 42.0;
     o.baseUnitDescription = "foo";
     o.displayQuantity = 42.0;
-    o.tieredRates = buildUnnamed72();
+    o.tieredRates = buildUnnamed67();
     o.usageUnit = "foo";
     o.usageUnitDescription = "foo";
   }
@@ -318,7 +317,7 @@
     unittest.expect(o.baseUnitConversionFactor, unittest.equals(42.0));
     unittest.expect(o.baseUnitDescription, unittest.equals('foo'));
     unittest.expect(o.displayQuantity, unittest.equals(42.0));
-    checkUnnamed72(o.tieredRates);
+    checkUnnamed67(o.tieredRates);
     unittest.expect(o.usageUnit, unittest.equals('foo'));
     unittest.expect(o.usageUnitDescription, unittest.equals('foo'));
   }
@@ -400,27 +399,27 @@
   buildCounterService--;
 }
 
-buildUnnamed73() {
+buildUnnamed68() {
   var o = new core.List<api.PricingInfo>();
   o.add(buildPricingInfo());
   o.add(buildPricingInfo());
   return o;
 }
 
-checkUnnamed73(core.List<api.PricingInfo> o) {
+checkUnnamed68(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingInfo(o[0]);
   checkPricingInfo(o[1]);
 }
 
-buildUnnamed74() {
+buildUnnamed69() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed74(core.List<core.String> o) {
+checkUnnamed69(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -434,9 +433,9 @@
     o.category = buildCategory();
     o.description = "foo";
     o.name = "foo";
-    o.pricingInfo = buildUnnamed73();
+    o.pricingInfo = buildUnnamed68();
     o.serviceProviderName = "foo";
-    o.serviceRegions = buildUnnamed74();
+    o.serviceRegions = buildUnnamed69();
     o.skuId = "foo";
   }
   buildCounterSku--;
@@ -449,9 +448,9 @@
     checkCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed73(o.pricingInfo);
+    checkUnnamed68(o.pricingInfo);
     unittest.expect(o.serviceProviderName, unittest.equals('foo'));
-    checkUnnamed74(o.serviceRegions);
+    checkUnnamed69(o.serviceRegions);
     unittest.expect(o.skuId, unittest.equals('foo'));
   }
   buildCounterSku--;
@@ -478,7 +477,6 @@
   buildCounterTierRate--;
 }
 
-
 main() {
   unittest.group("obj-schema-AggregationInfo", () {
     unittest.test("to-json--from-json", () {
@@ -488,7 +486,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BillingAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildBillingAccount();
@@ -497,7 +494,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Category", () {
     unittest.test("to-json--from-json", () {
       var o = buildCategory();
@@ -506,7 +502,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListBillingAccountsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListBillingAccountsResponse();
@@ -515,7 +510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListProjectBillingInfoResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListProjectBillingInfoResponse();
@@ -524,7 +518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListServicesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListServicesResponse();
@@ -533,7 +526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListSkusResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListSkusResponse();
@@ -542,7 +534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Money", () {
     unittest.test("to-json--from-json", () {
       var o = buildMoney();
@@ -551,7 +542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PricingExpression", () {
     unittest.test("to-json--from-json", () {
       var o = buildPricingExpression();
@@ -560,7 +550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PricingInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPricingInfo();
@@ -569,7 +558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectBillingInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectBillingInfo();
@@ -578,7 +566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Service", () {
     unittest.test("to-json--from-json", () {
       var o = buildService();
@@ -587,7 +574,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Sku", () {
     unittest.test("to-json--from-json", () {
       var o = buildSku();
@@ -596,7 +582,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TierRate", () {
     unittest.test("to-json--from-json", () {
       var o = buildTierRate();
@@ -605,21 +590,22 @@
     });
   });
 
-
   unittest.group("resource-BillingAccountsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsResourceApi res = new api.CloudbillingApi(mock).billingAccounts;
+      api.BillingAccountsResourceApi res =
+          new api.CloudbillingApi(mock).billingAccounts;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -633,29 +619,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBillingAccount());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.BillingAccount response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.BillingAccount response) {
         checkBillingAccount(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsResourceApi res = new api.CloudbillingApi(mock).billingAccounts;
+      api.BillingAccountsResourceApi res =
+          new api.CloudbillingApi(mock).billingAccounts;
       var arg_pageSize = 42;
       var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -663,9 +652,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/billingAccounts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/billingAccounts"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -678,35 +669,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListBillingAccountsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListBillingAccountsResponse response) {
+      res.list(pageSize: arg_pageSize, pageToken: arg_pageToken).then(
+          unittest.expectAsync1(((api.ListBillingAccountsResponse response) {
         checkListBillingAccountsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-BillingAccountsProjectsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsProjectsResourceApi res = new api.CloudbillingApi(mock).billingAccounts.projects;
+      api.BillingAccountsProjectsResourceApi res =
+          new api.CloudbillingApi(mock).billingAccounts.projects;
       var arg_name = "foo";
       var arg_pageSize = 42;
       var arg_pageToken = "foo";
@@ -715,9 +708,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -731,33 +726,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListProjectBillingInfoResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListProjectBillingInfoResponse response) {
+      res.list(arg_name, pageSize: arg_pageSize, pageToken: arg_pageToken).then(
+          unittest.expectAsync1(((api.ListProjectBillingInfoResponse response) {
         checkListProjectBillingInfoResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--getBillingInfo", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.CloudbillingApi(mock).projects;
       var arg_name = "foo";
@@ -766,9 +762,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -782,27 +780,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProjectBillingInfo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getBillingInfo(arg_name).then(unittest.expectAsync1(((api.ProjectBillingInfo response) {
+      res
+          .getBillingInfo(arg_name)
+          .then(unittest.expectAsync1(((api.ProjectBillingInfo response) {
         checkProjectBillingInfo(response);
       })));
     });
 
     unittest.test("method--updateBillingInfo", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.CloudbillingApi(mock).projects;
       var arg_request = buildProjectBillingInfo();
@@ -815,9 +815,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -831,31 +833,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProjectBillingInfo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.updateBillingInfo(arg_request, arg_name).then(unittest.expectAsync1(((api.ProjectBillingInfo response) {
+      res
+          .updateBillingInfo(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.ProjectBillingInfo response) {
         checkProjectBillingInfo(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.CloudbillingApi(mock).services;
       var arg_pageSize = 42;
@@ -865,9 +867,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/services"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/services"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -880,35 +884,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListServicesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListServicesResponse response) {
+      res
+          .list(pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListServicesResponse response) {
         checkListServicesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesSkusResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ServicesSkusResourceApi res = new api.CloudbillingApi(mock).services.skus;
+      api.ServicesSkusResourceApi res =
+          new api.CloudbillingApi(mock).services.skus;
       var arg_parent = "foo";
       var arg_currencyCode = "foo";
       var arg_endTime = "foo";
@@ -920,9 +927,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -936,32 +945,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["currencyCode"].first, unittest.equals(arg_currencyCode));
-        unittest.expect(queryMap["endTime"].first, unittest.equals(arg_endTime));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["startTime"].first, unittest.equals(arg_startTime));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["currencyCode"].first, unittest.equals(arg_currencyCode));
+        unittest.expect(
+            queryMap["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["startTime"].first, unittest.equals(arg_startTime));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSkusResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, currencyCode: arg_currencyCode, endTime: arg_endTime, pageSize: arg_pageSize, startTime: arg_startTime, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListSkusResponse response) {
+      res
+          .list(arg_parent,
+              currencyCode: arg_currencyCode,
+              endTime: arg_endTime,
+              pageSize: arg_pageSize,
+              startTime: arg_startTime,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListSkusResponse response) {
         checkListSkusResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudbuild/v1_test.dart b/generated/googleapis/test/cloudbuild/v1_test.dart
index 80acb4d..b268cba 100644
--- a/generated/googleapis/test/cloudbuild/v1_test.dart
+++ b/generated/googleapis/test/cloudbuild/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudbuild.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudbuild/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,72 +44,72 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1419() {
+buildUnnamed1409() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1419(core.List<core.String> o) {
+checkUnnamed1409(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1420() {
+buildUnnamed1410() {
   var o = new core.List<api.Secret>();
   o.add(buildSecret());
   o.add(buildSecret());
   return o;
 }
 
-checkUnnamed1420(core.List<api.Secret> o) {
+checkUnnamed1410(core.List<api.Secret> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSecret(o[0]);
   checkSecret(o[1]);
 }
 
-buildUnnamed1421() {
+buildUnnamed1411() {
   var o = new core.List<api.BuildStep>();
   o.add(buildBuildStep());
   o.add(buildBuildStep());
   return o;
 }
 
-checkUnnamed1421(core.List<api.BuildStep> o) {
+checkUnnamed1411(core.List<api.BuildStep> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuildStep(o[0]);
   checkBuildStep(o[1]);
 }
 
-buildUnnamed1422() {
+buildUnnamed1412() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1422(core.Map<core.String, core.String> o) {
+checkUnnamed1412(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1423() {
+buildUnnamed1413() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1423(core.List<core.String> o) {
+checkUnnamed1413(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -125,21 +124,21 @@
     o.createTime = "foo";
     o.finishTime = "foo";
     o.id = "foo";
-    o.images = buildUnnamed1419();
+    o.images = buildUnnamed1409();
     o.logUrl = "foo";
     o.logsBucket = "foo";
     o.options = buildBuildOptions();
     o.projectId = "foo";
     o.results = buildResults();
-    o.secrets = buildUnnamed1420();
+    o.secrets = buildUnnamed1410();
     o.source = buildSource();
     o.sourceProvenance = buildSourceProvenance();
     o.startTime = "foo";
     o.status = "foo";
     o.statusDetail = "foo";
-    o.steps = buildUnnamed1421();
-    o.substitutions = buildUnnamed1422();
-    o.tags = buildUnnamed1423();
+    o.steps = buildUnnamed1411();
+    o.substitutions = buildUnnamed1412();
+    o.tags = buildUnnamed1413();
     o.timeout = "foo";
   }
   buildCounterBuild--;
@@ -153,21 +152,21 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.finishTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1419(o.images);
+    checkUnnamed1409(o.images);
     unittest.expect(o.logUrl, unittest.equals('foo'));
     unittest.expect(o.logsBucket, unittest.equals('foo'));
     checkBuildOptions(o.options);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkResults(o.results);
-    checkUnnamed1420(o.secrets);
+    checkUnnamed1410(o.secrets);
     checkSource(o.source);
     checkSourceProvenance(o.sourceProvenance);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusDetail, unittest.equals('foo'));
-    checkUnnamed1421(o.steps);
-    checkUnnamed1422(o.substitutions);
-    checkUnnamed1423(o.tags);
+    checkUnnamed1411(o.steps);
+    checkUnnamed1412(o.substitutions);
+    checkUnnamed1413(o.tags);
     unittest.expect(o.timeout, unittest.equals('foo'));
   }
   buildCounterBuild--;
@@ -192,14 +191,14 @@
   buildCounterBuildOperationMetadata--;
 }
 
-buildUnnamed1424() {
+buildUnnamed1414() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1424(core.List<core.String> o) {
+checkUnnamed1414(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -211,7 +210,7 @@
   buildCounterBuildOptions++;
   if (buildCounterBuildOptions < 3) {
     o.requestedVerifyOption = "foo";
-    o.sourceProvenanceHash = buildUnnamed1424();
+    o.sourceProvenanceHash = buildUnnamed1414();
     o.substitutionOption = "foo";
   }
   buildCounterBuildOptions--;
@@ -222,72 +221,72 @@
   buildCounterBuildOptions++;
   if (buildCounterBuildOptions < 3) {
     unittest.expect(o.requestedVerifyOption, unittest.equals('foo'));
-    checkUnnamed1424(o.sourceProvenanceHash);
+    checkUnnamed1414(o.sourceProvenanceHash);
     unittest.expect(o.substitutionOption, unittest.equals('foo'));
   }
   buildCounterBuildOptions--;
 }
 
-buildUnnamed1425() {
+buildUnnamed1415() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1425(core.List<core.String> o) {
+checkUnnamed1415(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1426() {
+buildUnnamed1416() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1426(core.List<core.String> o) {
+checkUnnamed1416(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1427() {
+buildUnnamed1417() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1427(core.List<core.String> o) {
+checkUnnamed1417(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1428() {
+buildUnnamed1418() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed1428(core.List<api.Volume> o) {
+checkUnnamed1418(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
 }
 
-buildUnnamed1429() {
+buildUnnamed1419() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1429(core.List<core.String> o) {
+checkUnnamed1419(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -298,15 +297,15 @@
   var o = new api.BuildStep();
   buildCounterBuildStep++;
   if (buildCounterBuildStep < 3) {
-    o.args = buildUnnamed1425();
+    o.args = buildUnnamed1415();
     o.dir = "foo";
     o.entrypoint = "foo";
-    o.env = buildUnnamed1426();
+    o.env = buildUnnamed1416();
     o.id = "foo";
     o.name = "foo";
-    o.secretEnv = buildUnnamed1427();
-    o.volumes = buildUnnamed1428();
-    o.waitFor = buildUnnamed1429();
+    o.secretEnv = buildUnnamed1417();
+    o.volumes = buildUnnamed1418();
+    o.waitFor = buildUnnamed1419();
   }
   buildCounterBuildStep--;
   return o;
@@ -315,27 +314,27 @@
 checkBuildStep(api.BuildStep o) {
   buildCounterBuildStep++;
   if (buildCounterBuildStep < 3) {
-    checkUnnamed1425(o.args);
+    checkUnnamed1415(o.args);
     unittest.expect(o.dir, unittest.equals('foo'));
     unittest.expect(o.entrypoint, unittest.equals('foo'));
-    checkUnnamed1426(o.env);
+    checkUnnamed1416(o.env);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1427(o.secretEnv);
-    checkUnnamed1428(o.volumes);
-    checkUnnamed1429(o.waitFor);
+    checkUnnamed1417(o.secretEnv);
+    checkUnnamed1418(o.volumes);
+    checkUnnamed1419(o.waitFor);
   }
   buildCounterBuildStep--;
 }
 
-buildUnnamed1430() {
+buildUnnamed1420() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1430(core.Map<core.String, core.String> o) {
+checkUnnamed1420(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -352,7 +351,7 @@
     o.disabled = true;
     o.filename = "foo";
     o.id = "foo";
-    o.substitutions = buildUnnamed1430();
+    o.substitutions = buildUnnamed1420();
     o.triggerTemplate = buildRepoSource();
   }
   buildCounterBuildTrigger--;
@@ -368,7 +367,7 @@
     unittest.expect(o.disabled, unittest.isTrue);
     unittest.expect(o.filename, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1430(o.substitutions);
+    checkUnnamed1420(o.substitutions);
     checkRepoSource(o.triggerTemplate);
   }
   buildCounterBuildTrigger--;
@@ -399,16 +398,14 @@
 buildCancelBuildRequest() {
   var o = new api.CancelBuildRequest();
   buildCounterCancelBuildRequest++;
-  if (buildCounterCancelBuildRequest < 3) {
-  }
+  if (buildCounterCancelBuildRequest < 3) {}
   buildCounterCancelBuildRequest--;
   return o;
 }
 
 checkCancelBuildRequest(api.CancelBuildRequest o) {
   buildCounterCancelBuildRequest++;
-  if (buildCounterCancelBuildRequest < 3) {
-  }
+  if (buildCounterCancelBuildRequest < 3) {}
   buildCounterCancelBuildRequest--;
 }
 
@@ -416,16 +413,14 @@
 buildCancelOperationRequest() {
   var o = new api.CancelOperationRequest();
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
   return o;
 }
 
 checkCancelOperationRequest(api.CancelOperationRequest o) {
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
 }
 
@@ -433,27 +428,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed1431() {
+buildUnnamed1421() {
   var o = new core.List<api.Hash>();
   o.add(buildHash());
   o.add(buildHash());
   return o;
 }
 
-checkUnnamed1431(core.List<api.Hash> o) {
+checkUnnamed1421(core.List<api.Hash> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHash(o[0]);
   checkHash(o[1]);
@@ -464,7 +457,7 @@
   var o = new api.FileHashes();
   buildCounterFileHashes++;
   if (buildCounterFileHashes < 3) {
-    o.fileHash = buildUnnamed1431();
+    o.fileHash = buildUnnamed1421();
   }
   buildCounterFileHashes--;
   return o;
@@ -473,7 +466,7 @@
 checkFileHashes(api.FileHashes o) {
   buildCounterFileHashes++;
   if (buildCounterFileHashes < 3) {
-    checkUnnamed1431(o.fileHash);
+    checkUnnamed1421(o.fileHash);
   }
   buildCounterFileHashes--;
 }
@@ -499,14 +492,14 @@
   buildCounterHash--;
 }
 
-buildUnnamed1432() {
+buildUnnamed1422() {
   var o = new core.List<api.BuildTrigger>();
   o.add(buildBuildTrigger());
   o.add(buildBuildTrigger());
   return o;
 }
 
-checkUnnamed1432(core.List<api.BuildTrigger> o) {
+checkUnnamed1422(core.List<api.BuildTrigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuildTrigger(o[0]);
   checkBuildTrigger(o[1]);
@@ -517,7 +510,7 @@
   var o = new api.ListBuildTriggersResponse();
   buildCounterListBuildTriggersResponse++;
   if (buildCounterListBuildTriggersResponse < 3) {
-    o.triggers = buildUnnamed1432();
+    o.triggers = buildUnnamed1422();
   }
   buildCounterListBuildTriggersResponse--;
   return o;
@@ -526,19 +519,19 @@
 checkListBuildTriggersResponse(api.ListBuildTriggersResponse o) {
   buildCounterListBuildTriggersResponse++;
   if (buildCounterListBuildTriggersResponse < 3) {
-    checkUnnamed1432(o.triggers);
+    checkUnnamed1422(o.triggers);
   }
   buildCounterListBuildTriggersResponse--;
 }
 
-buildUnnamed1433() {
+buildUnnamed1423() {
   var o = new core.List<api.Build>();
   o.add(buildBuild());
   o.add(buildBuild());
   return o;
 }
 
-checkUnnamed1433(core.List<api.Build> o) {
+checkUnnamed1423(core.List<api.Build> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuild(o[0]);
   checkBuild(o[1]);
@@ -549,7 +542,7 @@
   var o = new api.ListBuildsResponse();
   buildCounterListBuildsResponse++;
   if (buildCounterListBuildsResponse < 3) {
-    o.builds = buildUnnamed1433();
+    o.builds = buildUnnamed1423();
     o.nextPageToken = "foo";
   }
   buildCounterListBuildsResponse--;
@@ -559,20 +552,20 @@
 checkListBuildsResponse(api.ListBuildsResponse o) {
   buildCounterListBuildsResponse++;
   if (buildCounterListBuildsResponse < 3) {
-    checkUnnamed1433(o.builds);
+    checkUnnamed1423(o.builds);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListBuildsResponse--;
 }
 
-buildUnnamed1434() {
+buildUnnamed1424() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1434(core.List<api.Operation> o) {
+checkUnnamed1424(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -584,7 +577,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1434();
+    o.operations = buildUnnamed1424();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -594,35 +587,67 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1434(o.operations);
+    checkUnnamed1424(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1435() {
+buildUnnamed1425() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1435(core.Map<core.String, core.Object> o) {
+checkUnnamed1425(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1436() {
+buildUnnamed1426() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1436(core.Map<core.String, core.Object> o) {
+checkUnnamed1426(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -632,9 +657,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1435();
+    o.metadata = buildUnnamed1425();
     o.name = "foo";
-    o.response = buildUnnamed1436();
+    o.response = buildUnnamed1426();
   }
   buildCounterOperation--;
   return o;
@@ -645,9 +670,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1435(o.metadata);
+    checkUnnamed1425(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1436(o.response);
+    checkUnnamed1426(o.response);
   }
   buildCounterOperation--;
 }
@@ -679,27 +704,27 @@
   buildCounterRepoSource--;
 }
 
-buildUnnamed1437() {
+buildUnnamed1427() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1437(core.List<core.String> o) {
+checkUnnamed1427(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1438() {
+buildUnnamed1428() {
   var o = new core.List<api.BuiltImage>();
   o.add(buildBuiltImage());
   o.add(buildBuiltImage());
   return o;
 }
 
-checkUnnamed1438(core.List<api.BuiltImage> o) {
+checkUnnamed1428(core.List<api.BuiltImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBuiltImage(o[0]);
   checkBuiltImage(o[1]);
@@ -710,8 +735,8 @@
   var o = new api.Results();
   buildCounterResults++;
   if (buildCounterResults < 3) {
-    o.buildStepImages = buildUnnamed1437();
-    o.images = buildUnnamed1438();
+    o.buildStepImages = buildUnnamed1427();
+    o.images = buildUnnamed1428();
   }
   buildCounterResults--;
   return o;
@@ -720,20 +745,20 @@
 checkResults(api.Results o) {
   buildCounterResults++;
   if (buildCounterResults < 3) {
-    checkUnnamed1437(o.buildStepImages);
-    checkUnnamed1438(o.images);
+    checkUnnamed1427(o.buildStepImages);
+    checkUnnamed1428(o.images);
   }
   buildCounterResults--;
 }
 
-buildUnnamed1439() {
+buildUnnamed1429() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1439(core.Map<core.String, core.String> o) {
+checkUnnamed1429(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -745,7 +770,7 @@
   buildCounterSecret++;
   if (buildCounterSecret < 3) {
     o.kmsKeyName = "foo";
-    o.secretEnv = buildUnnamed1439();
+    o.secretEnv = buildUnnamed1429();
   }
   buildCounterSecret--;
   return o;
@@ -755,7 +780,7 @@
   buildCounterSecret++;
   if (buildCounterSecret < 3) {
     unittest.expect(o.kmsKeyName, unittest.equals('foo'));
-    checkUnnamed1439(o.secretEnv);
+    checkUnnamed1429(o.secretEnv);
   }
   buildCounterSecret--;
 }
@@ -781,14 +806,14 @@
   buildCounterSource--;
 }
 
-buildUnnamed1440() {
+buildUnnamed1430() {
   var o = new core.Map<core.String, api.FileHashes>();
   o["x"] = buildFileHashes();
   o["y"] = buildFileHashes();
   return o;
 }
 
-checkUnnamed1440(core.Map<core.String, api.FileHashes> o) {
+checkUnnamed1430(core.Map<core.String, api.FileHashes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFileHashes(o["x"]);
   checkFileHashes(o["y"]);
@@ -799,7 +824,7 @@
   var o = new api.SourceProvenance();
   buildCounterSourceProvenance++;
   if (buildCounterSourceProvenance < 3) {
-    o.fileHashes = buildUnnamed1440();
+    o.fileHashes = buildUnnamed1430();
     o.resolvedRepoSource = buildRepoSource();
     o.resolvedStorageSource = buildStorageSource();
   }
@@ -810,37 +835,53 @@
 checkSourceProvenance(api.SourceProvenance o) {
   buildCounterSourceProvenance++;
   if (buildCounterSourceProvenance < 3) {
-    checkUnnamed1440(o.fileHashes);
+    checkUnnamed1430(o.fileHashes);
     checkRepoSource(o.resolvedRepoSource);
     checkStorageSource(o.resolvedStorageSource);
   }
   buildCounterSourceProvenance--;
 }
 
-buildUnnamed1441() {
+buildUnnamed1431() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1441(core.Map<core.String, core.Object> o) {
+checkUnnamed1431(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1442() {
+buildUnnamed1432() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1441());
-  o.add(buildUnnamed1441());
+  o.add(buildUnnamed1431());
+  o.add(buildUnnamed1431());
   return o;
 }
 
-checkUnnamed1442(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1432(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1441(o[0]);
-  checkUnnamed1441(o[1]);
+  checkUnnamed1431(o[0]);
+  checkUnnamed1431(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -849,7 +890,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1442();
+    o.details = buildUnnamed1432();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -860,7 +901,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1442(o.details);
+    checkUnnamed1432(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -910,7 +951,6 @@
   buildCounterVolume--;
 }
 
-
 main() {
   unittest.group("obj-schema-Build", () {
     unittest.test("to-json--from-json", () {
@@ -920,7 +960,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BuildOperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildBuildOperationMetadata();
@@ -929,7 +968,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BuildOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildBuildOptions();
@@ -938,7 +976,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BuildStep", () {
     unittest.test("to-json--from-json", () {
       var o = buildBuildStep();
@@ -947,7 +984,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BuildTrigger", () {
     unittest.test("to-json--from-json", () {
       var o = buildBuildTrigger();
@@ -956,7 +992,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BuiltImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildBuiltImage();
@@ -965,7 +1000,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CancelBuildRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCancelBuildRequest();
@@ -974,7 +1008,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CancelOperationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCancelOperationRequest();
@@ -983,7 +1016,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -992,7 +1024,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileHashes", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileHashes();
@@ -1001,7 +1032,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Hash", () {
     unittest.test("to-json--from-json", () {
       var o = buildHash();
@@ -1010,7 +1040,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListBuildTriggersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListBuildTriggersResponse();
@@ -1019,7 +1048,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListBuildsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListBuildsResponse();
@@ -1028,7 +1056,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -1037,7 +1064,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1046,7 +1072,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RepoSource", () {
     unittest.test("to-json--from-json", () {
       var o = buildRepoSource();
@@ -1055,7 +1080,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Results", () {
     unittest.test("to-json--from-json", () {
       var o = buildResults();
@@ -1064,7 +1088,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Secret", () {
     unittest.test("to-json--from-json", () {
       var o = buildSecret();
@@ -1073,7 +1096,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Source", () {
     unittest.test("to-json--from-json", () {
       var o = buildSource();
@@ -1082,7 +1104,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceProvenance", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceProvenance();
@@ -1091,7 +1112,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1100,7 +1120,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StorageSource", () {
     unittest.test("to-json--from-json", () {
       var o = buildStorageSource();
@@ -1109,7 +1128,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Volume", () {
     unittest.test("to-json--from-json", () {
       var o = buildVolume();
@@ -1118,10 +1136,8 @@
     });
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.CloudbuildApi(mock).operations;
       var arg_request = buildCancelOperationRequest();
@@ -1134,9 +1150,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1150,27 +1168,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .cancel(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.CloudbuildApi(mock).operations;
       var arg_name = "foo";
@@ -1179,9 +1199,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1195,16 +1217,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1215,21 +1238,22 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.CloudbuildApi(mock).operations;
       var arg_name = "foo";
-      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1243,36 +1267,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsBuildsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsBuildsResourceApi res = new api.CloudbuildApi(mock).projects.builds;
+      api.ProjectsBuildsResourceApi res =
+          new api.CloudbuildApi(mock).projects.builds;
       var arg_request = buildCancelBuildRequest();
       var arg_projectId = "foo";
       var arg_id = "foo";
@@ -1284,23 +1314,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/builds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/builds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/builds/"));
         pathOffset += 8;
         index = path.indexOf(":cancel", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":cancel"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":cancel"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1313,29 +1349,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBuild());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_projectId, arg_id).then(unittest.expectAsync1(((api.Build response) {
+      res
+          .cancel(arg_request, arg_projectId, arg_id)
+          .then(unittest.expectAsync1(((api.Build response) {
         checkBuild(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsBuildsResourceApi res = new api.CloudbuildApi(mock).projects.builds;
+      api.ProjectsBuildsResourceApi res =
+          new api.CloudbuildApi(mock).projects.builds;
       var arg_request = buildBuild();
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1346,16 +1385,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/builds", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/builds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/builds"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1368,29 +1411,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_projectId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsBuildsResourceApi res = new api.CloudbuildApi(mock).projects.builds;
+      api.ProjectsBuildsResourceApi res =
+          new api.CloudbuildApi(mock).projects.builds;
       var arg_projectId = "foo";
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1398,16 +1444,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/builds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/builds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/builds/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1423,29 +1473,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBuild());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_id).then(unittest.expectAsync1(((api.Build response) {
+      res
+          .get(arg_projectId, arg_id)
+          .then(unittest.expectAsync1(((api.Build response) {
         checkBuild(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsBuildsResourceApi res = new api.CloudbuildApi(mock).projects.builds;
+      api.ProjectsBuildsResourceApi res =
+          new api.CloudbuildApi(mock).projects.builds;
       var arg_projectId = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -1455,16 +1508,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/builds", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/builds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/builds"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1477,36 +1534,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListBuildsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListBuildsResponse response) {
+      res
+          .list(arg_projectId,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListBuildsResponse response) {
         checkListBuildsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsTriggersResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTriggersResourceApi res = new api.CloudbuildApi(mock).projects.triggers;
+      api.ProjectsTriggersResourceApi res =
+          new api.CloudbuildApi(mock).projects.triggers;
       var arg_request = buildBuildTrigger();
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1517,16 +1580,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/triggers", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/triggers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/triggers"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1539,29 +1606,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBuildTrigger());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_projectId).then(unittest.expectAsync1(((api.BuildTrigger response) {
+      res
+          .create(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.BuildTrigger response) {
         checkBuildTrigger(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTriggersResourceApi res = new api.CloudbuildApi(mock).projects.triggers;
+      api.ProjectsTriggersResourceApi res =
+          new api.CloudbuildApi(mock).projects.triggers;
       var arg_projectId = "foo";
       var arg_triggerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1569,16 +1639,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/triggers/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/triggers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/triggers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1594,29 +1668,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_projectId, arg_triggerId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_projectId, arg_triggerId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTriggersResourceApi res = new api.CloudbuildApi(mock).projects.triggers;
+      api.ProjectsTriggersResourceApi res =
+          new api.CloudbuildApi(mock).projects.triggers;
       var arg_projectId = "foo";
       var arg_triggerId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1624,16 +1701,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/triggers/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/triggers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/triggers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1649,45 +1730,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBuildTrigger());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_triggerId).then(unittest.expectAsync1(((api.BuildTrigger response) {
+      res
+          .get(arg_projectId, arg_triggerId)
+          .then(unittest.expectAsync1(((api.BuildTrigger response) {
         checkBuildTrigger(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTriggersResourceApi res = new api.CloudbuildApi(mock).projects.triggers;
+      api.ProjectsTriggersResourceApi res =
+          new api.CloudbuildApi(mock).projects.triggers;
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/triggers", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/triggers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/triggers"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1700,29 +1788,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListBuildTriggersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId).then(unittest.expectAsync1(((api.ListBuildTriggersResponse response) {
+      res.list(arg_projectId).then(
+          unittest.expectAsync1(((api.ListBuildTriggersResponse response) {
         checkListBuildTriggersResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTriggersResourceApi res = new api.CloudbuildApi(mock).projects.triggers;
+      api.ProjectsTriggersResourceApi res =
+          new api.CloudbuildApi(mock).projects.triggers;
       var arg_request = buildBuildTrigger();
       var arg_projectId = "foo";
       var arg_triggerId = "foo";
@@ -1734,16 +1824,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/triggers/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/triggers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/triggers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1759,27 +1853,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBuildTrigger());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_projectId, arg_triggerId).then(unittest.expectAsync1(((api.BuildTrigger response) {
+      res
+          .patch(arg_request, arg_projectId, arg_triggerId)
+          .then(unittest.expectAsync1(((api.BuildTrigger response) {
         checkBuildTrigger(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/clouddebugger/v2_test.dart b/generated/googleapis/test/clouddebugger/v2_test.dart
index e8ef718..c9b40ab 100644
--- a/generated/googleapis/test/clouddebugger/v2_test.dart
+++ b/generated/googleapis/test/clouddebugger/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.clouddebugger.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/clouddebugger/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -72,66 +71,66 @@
   buildCounterAliasContext--;
 }
 
-buildUnnamed883() {
+buildUnnamed886() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed883(core.List<api.Variable> o) {
+checkUnnamed886(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
 }
 
-buildUnnamed884() {
+buildUnnamed887() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed884(core.List<core.String> o) {
+checkUnnamed887(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed885() {
+buildUnnamed888() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed885(core.Map<core.String, core.String> o) {
+checkUnnamed888(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed886() {
+buildUnnamed889() {
   var o = new core.List<api.StackFrame>();
   o.add(buildStackFrame());
   o.add(buildStackFrame());
   return o;
 }
 
-checkUnnamed886(core.List<api.StackFrame> o) {
+checkUnnamed889(core.List<api.StackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStackFrame(o[0]);
   checkStackFrame(o[1]);
 }
 
-buildUnnamed887() {
+buildUnnamed890() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed887(core.List<api.Variable> o) {
+checkUnnamed890(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -145,19 +144,19 @@
     o.action = "foo";
     o.condition = "foo";
     o.createTime = "foo";
-    o.evaluatedExpressions = buildUnnamed883();
-    o.expressions = buildUnnamed884();
+    o.evaluatedExpressions = buildUnnamed886();
+    o.expressions = buildUnnamed887();
     o.finalTime = "foo";
     o.id = "foo";
     o.isFinalState = true;
-    o.labels = buildUnnamed885();
+    o.labels = buildUnnamed888();
     o.location = buildSourceLocation();
     o.logLevel = "foo";
     o.logMessageFormat = "foo";
-    o.stackFrames = buildUnnamed886();
+    o.stackFrames = buildUnnamed889();
     o.status = buildStatusMessage();
     o.userEmail = "foo";
-    o.variableTable = buildUnnamed887();
+    o.variableTable = buildUnnamed890();
   }
   buildCounterBreakpoint--;
   return o;
@@ -169,19 +168,19 @@
     unittest.expect(o.action, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed883(o.evaluatedExpressions);
-    checkUnnamed884(o.expressions);
+    checkUnnamed886(o.evaluatedExpressions);
+    checkUnnamed887(o.expressions);
     unittest.expect(o.finalTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isFinalState, unittest.isTrue);
-    checkUnnamed885(o.labels);
+    checkUnnamed888(o.labels);
     checkSourceLocation(o.location);
     unittest.expect(o.logLevel, unittest.equals('foo'));
     unittest.expect(o.logMessageFormat, unittest.equals('foo'));
-    checkUnnamed886(o.stackFrames);
+    checkUnnamed889(o.stackFrames);
     checkStatusMessage(o.status);
     unittest.expect(o.userEmail, unittest.equals('foo'));
-    checkUnnamed887(o.variableTable);
+    checkUnnamed890(o.variableTable);
   }
   buildCounterBreakpoint--;
 }
@@ -253,40 +252,40 @@
   buildCounterCloudWorkspaceSourceContext--;
 }
 
-buildUnnamed888() {
+buildUnnamed891() {
   var o = new core.List<api.ExtendedSourceContext>();
   o.add(buildExtendedSourceContext());
   o.add(buildExtendedSourceContext());
   return o;
 }
 
-checkUnnamed888(core.List<api.ExtendedSourceContext> o) {
+checkUnnamed891(core.List<api.ExtendedSourceContext> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExtendedSourceContext(o[0]);
   checkExtendedSourceContext(o[1]);
 }
 
-buildUnnamed889() {
+buildUnnamed892() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed889(core.Map<core.String, core.String> o) {
+checkUnnamed892(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed890() {
+buildUnnamed893() {
   var o = new core.List<api.SourceContext>();
   o.add(buildSourceContext());
   o.add(buildSourceContext());
   return o;
 }
 
-checkUnnamed890(core.List<api.SourceContext> o) {
+checkUnnamed893(core.List<api.SourceContext> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSourceContext(o[0]);
   checkSourceContext(o[1]);
@@ -299,13 +298,13 @@
   if (buildCounterDebuggee < 3) {
     o.agentVersion = "foo";
     o.description = "foo";
-    o.extSourceContexts = buildUnnamed888();
+    o.extSourceContexts = buildUnnamed891();
     o.id = "foo";
     o.isDisabled = true;
     o.isInactive = true;
-    o.labels = buildUnnamed889();
+    o.labels = buildUnnamed892();
     o.project = "foo";
-    o.sourceContexts = buildUnnamed890();
+    o.sourceContexts = buildUnnamed893();
     o.status = buildStatusMessage();
     o.uniquifier = "foo";
   }
@@ -318,13 +317,13 @@
   if (buildCounterDebuggee < 3) {
     unittest.expect(o.agentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed888(o.extSourceContexts);
+    checkUnnamed891(o.extSourceContexts);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isDisabled, unittest.isTrue);
     unittest.expect(o.isInactive, unittest.isTrue);
-    checkUnnamed889(o.labels);
+    checkUnnamed892(o.labels);
     unittest.expect(o.project, unittest.equals('foo'));
-    checkUnnamed890(o.sourceContexts);
+    checkUnnamed893(o.sourceContexts);
     checkStatusMessage(o.status);
     unittest.expect(o.uniquifier, unittest.equals('foo'));
   }
@@ -335,27 +334,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed891() {
+buildUnnamed894() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed891(core.Map<core.String, core.String> o) {
+checkUnnamed894(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -367,7 +364,7 @@
   buildCounterExtendedSourceContext++;
   if (buildCounterExtendedSourceContext < 3) {
     o.context = buildSourceContext();
-    o.labels = buildUnnamed891();
+    o.labels = buildUnnamed894();
   }
   buildCounterExtendedSourceContext--;
   return o;
@@ -377,19 +374,19 @@
   buildCounterExtendedSourceContext++;
   if (buildCounterExtendedSourceContext < 3) {
     checkSourceContext(o.context);
-    checkUnnamed891(o.labels);
+    checkUnnamed894(o.labels);
   }
   buildCounterExtendedSourceContext--;
 }
 
-buildUnnamed892() {
+buildUnnamed895() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed892(core.List<core.String> o) {
+checkUnnamed895(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -401,7 +398,7 @@
   buildCounterFormatMessage++;
   if (buildCounterFormatMessage < 3) {
     o.format = "foo";
-    o.parameters = buildUnnamed892();
+    o.parameters = buildUnnamed895();
   }
   buildCounterFormatMessage--;
   return o;
@@ -411,7 +408,7 @@
   buildCounterFormatMessage++;
   if (buildCounterFormatMessage < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed892(o.parameters);
+    checkUnnamed895(o.parameters);
   }
   buildCounterFormatMessage--;
 }
@@ -483,14 +480,14 @@
   buildCounterGitSourceContext--;
 }
 
-buildUnnamed893() {
+buildUnnamed896() {
   var o = new core.List<api.Breakpoint>();
   o.add(buildBreakpoint());
   o.add(buildBreakpoint());
   return o;
 }
 
-checkUnnamed893(core.List<api.Breakpoint> o) {
+checkUnnamed896(core.List<api.Breakpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBreakpoint(o[0]);
   checkBreakpoint(o[1]);
@@ -501,7 +498,7 @@
   var o = new api.ListActiveBreakpointsResponse();
   buildCounterListActiveBreakpointsResponse++;
   if (buildCounterListActiveBreakpointsResponse < 3) {
-    o.breakpoints = buildUnnamed893();
+    o.breakpoints = buildUnnamed896();
     o.nextWaitToken = "foo";
     o.waitExpired = true;
   }
@@ -512,21 +509,21 @@
 checkListActiveBreakpointsResponse(api.ListActiveBreakpointsResponse o) {
   buildCounterListActiveBreakpointsResponse++;
   if (buildCounterListActiveBreakpointsResponse < 3) {
-    checkUnnamed893(o.breakpoints);
+    checkUnnamed896(o.breakpoints);
     unittest.expect(o.nextWaitToken, unittest.equals('foo'));
     unittest.expect(o.waitExpired, unittest.isTrue);
   }
   buildCounterListActiveBreakpointsResponse--;
 }
 
-buildUnnamed894() {
+buildUnnamed897() {
   var o = new core.List<api.Breakpoint>();
   o.add(buildBreakpoint());
   o.add(buildBreakpoint());
   return o;
 }
 
-checkUnnamed894(core.List<api.Breakpoint> o) {
+checkUnnamed897(core.List<api.Breakpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBreakpoint(o[0]);
   checkBreakpoint(o[1]);
@@ -537,7 +534,7 @@
   var o = new api.ListBreakpointsResponse();
   buildCounterListBreakpointsResponse++;
   if (buildCounterListBreakpointsResponse < 3) {
-    o.breakpoints = buildUnnamed894();
+    o.breakpoints = buildUnnamed897();
     o.nextWaitToken = "foo";
   }
   buildCounterListBreakpointsResponse--;
@@ -547,20 +544,20 @@
 checkListBreakpointsResponse(api.ListBreakpointsResponse o) {
   buildCounterListBreakpointsResponse++;
   if (buildCounterListBreakpointsResponse < 3) {
-    checkUnnamed894(o.breakpoints);
+    checkUnnamed897(o.breakpoints);
     unittest.expect(o.nextWaitToken, unittest.equals('foo'));
   }
   buildCounterListBreakpointsResponse--;
 }
 
-buildUnnamed895() {
+buildUnnamed898() {
   var o = new core.List<api.Debuggee>();
   o.add(buildDebuggee());
   o.add(buildDebuggee());
   return o;
 }
 
-checkUnnamed895(core.List<api.Debuggee> o) {
+checkUnnamed898(core.List<api.Debuggee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDebuggee(o[0]);
   checkDebuggee(o[1]);
@@ -571,7 +568,7 @@
   var o = new api.ListDebuggeesResponse();
   buildCounterListDebuggeesResponse++;
   if (buildCounterListDebuggeesResponse < 3) {
-    o.debuggees = buildUnnamed895();
+    o.debuggees = buildUnnamed898();
   }
   buildCounterListDebuggeesResponse--;
   return o;
@@ -580,7 +577,7 @@
 checkListDebuggeesResponse(api.ListDebuggeesResponse o) {
   buildCounterListDebuggeesResponse++;
   if (buildCounterListDebuggeesResponse < 3) {
-    checkUnnamed895(o.debuggees);
+    checkUnnamed898(o.debuggees);
   }
   buildCounterListDebuggeesResponse--;
 }
@@ -730,27 +727,27 @@
   buildCounterSourceLocation--;
 }
 
-buildUnnamed896() {
+buildUnnamed899() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed896(core.List<api.Variable> o) {
+checkUnnamed899(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
 }
 
-buildUnnamed897() {
+buildUnnamed900() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed897(core.List<api.Variable> o) {
+checkUnnamed900(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -761,9 +758,9 @@
   var o = new api.StackFrame();
   buildCounterStackFrame++;
   if (buildCounterStackFrame < 3) {
-    o.arguments = buildUnnamed896();
+    o.arguments = buildUnnamed899();
     o.function = "foo";
-    o.locals = buildUnnamed897();
+    o.locals = buildUnnamed900();
     o.location = buildSourceLocation();
   }
   buildCounterStackFrame--;
@@ -773,9 +770,9 @@
 checkStackFrame(api.StackFrame o) {
   buildCounterStackFrame++;
   if (buildCounterStackFrame < 3) {
-    checkUnnamed896(o.arguments);
+    checkUnnamed899(o.arguments);
     unittest.expect(o.function, unittest.equals('foo'));
-    checkUnnamed897(o.locals);
+    checkUnnamed900(o.locals);
     checkSourceLocation(o.location);
   }
   buildCounterStackFrame--;
@@ -827,27 +824,25 @@
 buildUpdateActiveBreakpointResponse() {
   var o = new api.UpdateActiveBreakpointResponse();
   buildCounterUpdateActiveBreakpointResponse++;
-  if (buildCounterUpdateActiveBreakpointResponse < 3) {
-  }
+  if (buildCounterUpdateActiveBreakpointResponse < 3) {}
   buildCounterUpdateActiveBreakpointResponse--;
   return o;
 }
 
 checkUpdateActiveBreakpointResponse(api.UpdateActiveBreakpointResponse o) {
   buildCounterUpdateActiveBreakpointResponse++;
-  if (buildCounterUpdateActiveBreakpointResponse < 3) {
-  }
+  if (buildCounterUpdateActiveBreakpointResponse < 3) {}
   buildCounterUpdateActiveBreakpointResponse--;
 }
 
-buildUnnamed898() {
+buildUnnamed901() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed898(core.List<api.Variable> o) {
+checkUnnamed901(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -858,7 +853,7 @@
   var o = new api.Variable();
   buildCounterVariable++;
   if (buildCounterVariable < 3) {
-    o.members = buildUnnamed898();
+    o.members = buildUnnamed901();
     o.name = "foo";
     o.status = buildStatusMessage();
     o.type = "foo";
@@ -872,7 +867,7 @@
 checkVariable(api.Variable o) {
   buildCounterVariable++;
   if (buildCounterVariable < 3) {
-    checkUnnamed898(o.members);
+    checkUnnamed901(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
     checkStatusMessage(o.status);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -882,7 +877,6 @@
   buildCounterVariable--;
 }
 
-
 main() {
   unittest.group("obj-schema-AliasContext", () {
     unittest.test("to-json--from-json", () {
@@ -892,7 +886,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Breakpoint", () {
     unittest.test("to-json--from-json", () {
       var o = buildBreakpoint();
@@ -901,7 +894,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CloudRepoSourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildCloudRepoSourceContext();
@@ -910,7 +902,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CloudWorkspaceId", () {
     unittest.test("to-json--from-json", () {
       var o = buildCloudWorkspaceId();
@@ -919,7 +910,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CloudWorkspaceSourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildCloudWorkspaceSourceContext();
@@ -928,7 +918,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Debuggee", () {
     unittest.test("to-json--from-json", () {
       var o = buildDebuggee();
@@ -937,7 +926,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -946,7 +934,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExtendedSourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildExtendedSourceContext();
@@ -955,7 +942,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FormatMessage", () {
     unittest.test("to-json--from-json", () {
       var o = buildFormatMessage();
@@ -964,7 +950,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GerritSourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildGerritSourceContext();
@@ -973,7 +958,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetBreakpointResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetBreakpointResponse();
@@ -982,7 +966,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GitSourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildGitSourceContext();
@@ -991,7 +974,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListActiveBreakpointsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListActiveBreakpointsResponse();
@@ -1000,7 +982,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListBreakpointsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListBreakpointsResponse();
@@ -1009,7 +990,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListDebuggeesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListDebuggeesResponse();
@@ -1018,7 +998,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectRepoId", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectRepoId();
@@ -1027,7 +1006,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RegisterDebuggeeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegisterDebuggeeRequest();
@@ -1036,7 +1014,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RegisterDebuggeeResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegisterDebuggeeResponse();
@@ -1045,7 +1022,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RepoId", () {
     unittest.test("to-json--from-json", () {
       var o = buildRepoId();
@@ -1054,7 +1030,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetBreakpointResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetBreakpointResponse();
@@ -1063,7 +1038,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceContext();
@@ -1072,7 +1046,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceLocation();
@@ -1081,7 +1054,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StackFrame", () {
     unittest.test("to-json--from-json", () {
       var o = buildStackFrame();
@@ -1090,7 +1062,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StatusMessage", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatusMessage();
@@ -1099,7 +1070,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateActiveBreakpointRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateActiveBreakpointRequest();
@@ -1108,7 +1078,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateActiveBreakpointResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateActiveBreakpointResponse();
@@ -1117,7 +1086,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Variable", () {
     unittest.test("to-json--from-json", () {
       var o = buildVariable();
@@ -1126,12 +1094,11 @@
     });
   });
 
-
   unittest.group("resource-ControllerDebuggeesResourceApi", () {
     unittest.test("method--register", () {
-
       var mock = new HttpServerMock();
-      api.ControllerDebuggeesResourceApi res = new api.ClouddebuggerApi(mock).controller.debuggees;
+      api.ControllerDebuggeesResourceApi res =
+          new api.ClouddebuggerApi(mock).controller.debuggees;
       var arg_request = buildRegisterDebuggeeRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.RegisterDebuggeeRequest.fromJson(json);
@@ -1141,9 +1108,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("v2/controller/debuggees/register"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("v2/controller/debuggees/register"));
         pathOffset += 32;
 
         var query = (req.url).query;
@@ -1156,33 +1125,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRegisterDebuggeeResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.register(arg_request).then(unittest.expectAsync1(((api.RegisterDebuggeeResponse response) {
+      res
+          .register(arg_request)
+          .then(unittest.expectAsync1(((api.RegisterDebuggeeResponse response) {
         checkRegisterDebuggeeResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ControllerDebuggeesBreakpointsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ControllerDebuggeesBreakpointsResourceApi res = new api.ClouddebuggerApi(mock).controller.debuggees.breakpoints;
+      api.ControllerDebuggeesBreakpointsResourceApi res =
+          new api.ClouddebuggerApi(mock).controller.debuggees.breakpoints;
       var arg_debuggeeId = "foo";
       var arg_successOnTimeout = true;
       var arg_waitToken = "foo";
@@ -1191,16 +1161,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("v2/controller/debuggees/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("v2/controller/debuggees/"));
         pathOffset += 24;
         index = path.indexOf("/breakpoints", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_debuggeeId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/breakpoints"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/breakpoints"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1213,31 +1187,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["successOnTimeout"].first, unittest.equals("$arg_successOnTimeout"));
-        unittest.expect(queryMap["waitToken"].first, unittest.equals(arg_waitToken));
-
+        unittest.expect(queryMap["successOnTimeout"].first,
+            unittest.equals("$arg_successOnTimeout"));
+        unittest.expect(
+            queryMap["waitToken"].first, unittest.equals(arg_waitToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListActiveBreakpointsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_debuggeeId, successOnTimeout: arg_successOnTimeout, waitToken: arg_waitToken).then(unittest.expectAsync1(((api.ListActiveBreakpointsResponse response) {
+      res
+          .list(arg_debuggeeId,
+              successOnTimeout: arg_successOnTimeout, waitToken: arg_waitToken)
+          .then(unittest
+              .expectAsync1(((api.ListActiveBreakpointsResponse response) {
         checkListActiveBreakpointsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ControllerDebuggeesBreakpointsResourceApi res = new api.ClouddebuggerApi(mock).controller.debuggees.breakpoints;
+      api.ControllerDebuggeesBreakpointsResourceApi res =
+          new api.ClouddebuggerApi(mock).controller.debuggees.breakpoints;
       var arg_request = buildUpdateActiveBreakpointRequest();
       var arg_debuggeeId = "foo";
       var arg_id = "foo";
@@ -1249,16 +1230,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("v2/controller/debuggees/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("v2/controller/debuggees/"));
         pathOffset += 24;
         index = path.indexOf("/breakpoints/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_debuggeeId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/breakpoints/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/breakpoints/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1274,33 +1259,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUpdateActiveBreakpointResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_debuggeeId, arg_id).then(unittest.expectAsync1(((api.UpdateActiveBreakpointResponse response) {
+      res.update(arg_request, arg_debuggeeId, arg_id).then(
+          unittest.expectAsync1(((api.UpdateActiveBreakpointResponse response) {
         checkUpdateActiveBreakpointResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DebuggerDebuggeesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.DebuggerDebuggeesResourceApi res = new api.ClouddebuggerApi(mock).debugger.debuggees;
+      api.DebuggerDebuggeesResourceApi res =
+          new api.ClouddebuggerApi(mock).debugger.debuggees;
       var arg_clientVersion = "foo";
       var arg_includeInactive = true;
       var arg_project = "foo";
@@ -1309,9 +1294,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("v2/debugger/debuggees"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("v2/debugger/debuggees"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -1324,36 +1311,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-        unittest.expect(queryMap["includeInactive"].first, unittest.equals("$arg_includeInactive"));
-        unittest.expect(queryMap["project"].first, unittest.equals(arg_project));
-
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
+        unittest.expect(queryMap["includeInactive"].first,
+            unittest.equals("$arg_includeInactive"));
+        unittest.expect(
+            queryMap["project"].first, unittest.equals(arg_project));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListDebuggeesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(clientVersion: arg_clientVersion, includeInactive: arg_includeInactive, project: arg_project).then(unittest.expectAsync1(((api.ListDebuggeesResponse response) {
+      res
+          .list(
+              clientVersion: arg_clientVersion,
+              includeInactive: arg_includeInactive,
+              project: arg_project)
+          .then(unittest.expectAsync1(((api.ListDebuggeesResponse response) {
         checkListDebuggeesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DebuggerDebuggeesBreakpointsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.DebuggerDebuggeesBreakpointsResourceApi res = new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
+      api.DebuggerDebuggeesBreakpointsResourceApi res =
+          new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
       var arg_debuggeeId = "foo";
       var arg_breakpointId = "foo";
       var arg_clientVersion = "foo";
@@ -1362,16 +1356,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("v2/debugger/debuggees/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("v2/debugger/debuggees/"));
         pathOffset += 22;
         index = path.indexOf("/breakpoints/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_debuggeeId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/breakpoints/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/breakpoints/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1387,30 +1385,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_debuggeeId, arg_breakpointId, clientVersion: arg_clientVersion).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_debuggeeId, arg_breakpointId,
+              clientVersion: arg_clientVersion)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.DebuggerDebuggeesBreakpointsResourceApi res = new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
+      api.DebuggerDebuggeesBreakpointsResourceApi res =
+          new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
       var arg_debuggeeId = "foo";
       var arg_breakpointId = "foo";
       var arg_clientVersion = "foo";
@@ -1419,16 +1422,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("v2/debugger/debuggees/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("v2/debugger/debuggees/"));
         pathOffset += 22;
         index = path.indexOf("/breakpoints/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_debuggeeId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/breakpoints/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/breakpoints/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1444,52 +1451,61 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetBreakpointResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_debuggeeId, arg_breakpointId, clientVersion: arg_clientVersion).then(unittest.expectAsync1(((api.GetBreakpointResponse response) {
+      res
+          .get(arg_debuggeeId, arg_breakpointId,
+              clientVersion: arg_clientVersion)
+          .then(unittest.expectAsync1(((api.GetBreakpointResponse response) {
         checkGetBreakpointResponse(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.DebuggerDebuggeesBreakpointsResourceApi res = new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
+      api.DebuggerDebuggeesBreakpointsResourceApi res =
+          new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
       var arg_debuggeeId = "foo";
+      var arg_includeAllUsers = true;
+      var arg_includeInactive = true;
       var arg_stripResults = true;
       var arg_waitToken = "foo";
       var arg_clientVersion = "foo";
       var arg_action_value = "foo";
-      var arg_includeInactive = true;
-      var arg_includeAllUsers = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("v2/debugger/debuggees/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("v2/debugger/debuggees/"));
         pathOffset += 22;
         index = path.indexOf("/breakpoints", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_debuggeeId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/breakpoints"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/breakpoints"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1502,35 +1518,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["stripResults"].first, unittest.equals("$arg_stripResults"));
-        unittest.expect(queryMap["waitToken"].first, unittest.equals(arg_waitToken));
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-        unittest.expect(queryMap["action.value"].first, unittest.equals(arg_action_value));
-        unittest.expect(queryMap["includeInactive"].first, unittest.equals("$arg_includeInactive"));
-        unittest.expect(queryMap["includeAllUsers"].first, unittest.equals("$arg_includeAllUsers"));
-
+        unittest.expect(queryMap["includeAllUsers"].first,
+            unittest.equals("$arg_includeAllUsers"));
+        unittest.expect(queryMap["includeInactive"].first,
+            unittest.equals("$arg_includeInactive"));
+        unittest.expect(queryMap["stripResults"].first,
+            unittest.equals("$arg_stripResults"));
+        unittest.expect(
+            queryMap["waitToken"].first, unittest.equals(arg_waitToken));
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
+        unittest.expect(
+            queryMap["action.value"].first, unittest.equals(arg_action_value));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListBreakpointsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_debuggeeId, stripResults: arg_stripResults, waitToken: arg_waitToken, clientVersion: arg_clientVersion, action_value: arg_action_value, includeInactive: arg_includeInactive, includeAllUsers: arg_includeAllUsers).then(unittest.expectAsync1(((api.ListBreakpointsResponse response) {
+      res
+          .list(arg_debuggeeId,
+              includeAllUsers: arg_includeAllUsers,
+              includeInactive: arg_includeInactive,
+              stripResults: arg_stripResults,
+              waitToken: arg_waitToken,
+              clientVersion: arg_clientVersion,
+              action_value: arg_action_value)
+          .then(unittest.expectAsync1(((api.ListBreakpointsResponse response) {
         checkListBreakpointsResponse(response);
       })));
     });
 
     unittest.test("method--set", () {
-
       var mock = new HttpServerMock();
-      api.DebuggerDebuggeesBreakpointsResourceApi res = new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
+      api.DebuggerDebuggeesBreakpointsResourceApi res =
+          new api.ClouddebuggerApi(mock).debugger.debuggees.breakpoints;
       var arg_request = buildBreakpoint();
       var arg_debuggeeId = "foo";
       var arg_clientVersion = "foo";
@@ -1542,16 +1573,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("v2/debugger/debuggees/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("v2/debugger/debuggees/"));
         pathOffset += 22;
         index = path.indexOf("/breakpoints/set", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_debuggeeId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/breakpoints/set"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/breakpoints/set"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -1564,28 +1599,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSetBreakpointResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.set(arg_request, arg_debuggeeId, clientVersion: arg_clientVersion).then(unittest.expectAsync1(((api.SetBreakpointResponse response) {
+      res
+          .set(arg_request, arg_debuggeeId, clientVersion: arg_clientVersion)
+          .then(unittest.expectAsync1(((api.SetBreakpointResponse response) {
         checkSetBreakpointResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudfunctions/v1_test.dart b/generated/googleapis/test/cloudfunctions/v1_test.dart
index c232eef..6d1ba94 100644
--- a/generated/googleapis/test/cloudfunctions/v1_test.dart
+++ b/generated/googleapis/test/cloudfunctions/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudfunctions.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudfunctions/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed146() {
+buildUnnamed141() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed146(core.List<api.Location> o) {
+checkUnnamed141(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -69,7 +68,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed146();
+    o.locations = buildUnnamed141();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -79,20 +78,20 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed146(o.locations);
+    checkUnnamed141(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed147() {
+buildUnnamed142() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed147(core.List<api.Operation> o) {
+checkUnnamed142(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -104,7 +103,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed147();
+    o.operations = buildUnnamed142();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -114,35 +113,51 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed147(o.operations);
+    checkUnnamed142(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed148() {
+buildUnnamed143() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed148(core.Map<core.String, core.String> o) {
+checkUnnamed143(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed149() {
+buildUnnamed144() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed149(core.Map<core.String, core.Object> o) {
+checkUnnamed144(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterLocation = 0;
@@ -150,9 +165,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed148();
+    o.labels = buildUnnamed143();
     o.locationId = "foo";
-    o.metadata = buildUnnamed149();
+    o.metadata = buildUnnamed144();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -162,38 +177,70 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed148(o.labels);
+    checkUnnamed143(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed149(o.metadata);
+    checkUnnamed144(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
 }
 
-buildUnnamed150() {
+buildUnnamed145() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed150(core.Map<core.String, core.Object> o) {
+checkUnnamed145(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed151() {
+buildUnnamed146() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed151(core.Map<core.String, core.Object> o) {
+checkUnnamed146(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -203,9 +250,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed150();
+    o.metadata = buildUnnamed145();
     o.name = "foo";
-    o.response = buildUnnamed151();
+    o.response = buildUnnamed146();
   }
   buildCounterOperation--;
   return o;
@@ -216,24 +263,40 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed150(o.metadata);
+    checkUnnamed145(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed151(o.response);
+    checkUnnamed146(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed152() {
+buildUnnamed147() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed152(core.Map<core.String, core.Object> o) {
+checkUnnamed147(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperationMetadataV1Beta2 = 0;
@@ -241,7 +304,7 @@
   var o = new api.OperationMetadataV1Beta2();
   buildCounterOperationMetadataV1Beta2++;
   if (buildCounterOperationMetadataV1Beta2 < 3) {
-    o.request = buildUnnamed152();
+    o.request = buildUnnamed147();
     o.target = "foo";
     o.type = "foo";
   }
@@ -252,37 +315,53 @@
 checkOperationMetadataV1Beta2(api.OperationMetadataV1Beta2 o) {
   buildCounterOperationMetadataV1Beta2++;
   if (buildCounterOperationMetadataV1Beta2 < 3) {
-    checkUnnamed152(o.request);
+    checkUnnamed147(o.request);
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterOperationMetadataV1Beta2--;
 }
 
-buildUnnamed153() {
+buildUnnamed148() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed153(core.Map<core.String, core.Object> o) {
+checkUnnamed148(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o["x"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o["y"]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+  var casted9 = (o["x"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o["y"]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
-buildUnnamed154() {
+buildUnnamed149() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed153());
-  o.add(buildUnnamed153());
+  o.add(buildUnnamed148());
+  o.add(buildUnnamed148());
   return o;
 }
 
-checkUnnamed154(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed149(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed153(o[0]);
-  checkUnnamed153(o[1]);
+  checkUnnamed148(o[0]);
+  checkUnnamed148(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -291,7 +370,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed154();
+    o.details = buildUnnamed149();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -302,13 +381,12 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed154(o.details);
+    checkUnnamed149(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-
 main() {
   unittest.group("obj-schema-ListLocationsResponse", () {
     unittest.test("to-json--from-json", () {
@@ -318,7 +396,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -327,7 +404,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Location", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocation();
@@ -336,7 +412,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -345,7 +420,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadataV1Beta2", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadataV1Beta2();
@@ -354,7 +428,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -363,21 +436,22 @@
     });
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.CloudfunctionsApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.CloudfunctionsApi(mock).operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -391,16 +465,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -411,9 +486,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.CloudfunctionsApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.CloudfunctionsApi(mock).operations;
       var arg_pageToken = "foo";
       var arg_name = "foo";
       var arg_pageSize = 42;
@@ -423,9 +498,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("v1/operations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("v1/operations"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -438,49 +515,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageToken: arg_pageToken, name: arg_name, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(
+              pageToken: arg_pageToken,
+              name: arg_name,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsLocationsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsResourceApi res = new api.CloudfunctionsApi(mock).projects.locations;
+      api.ProjectsLocationsResourceApi res =
+          new api.CloudfunctionsApi(mock).projects.locations;
       var arg_name = "foo";
-      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -494,30 +580,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLocationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListLocationsResponse response) {
+      res
+          .list(arg_name,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudkms/v1_test.dart b/generated/googleapis/test/cloudkms/v1_test.dart
index 5342a92..8835c75 100644
--- a/generated/googleapis/test/cloudkms/v1_test.dart
+++ b/generated/googleapis/test/cloudkms/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudkms.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudkms/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,33 +44,33 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1387() {
+buildUnnamed1383() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed1387(core.List<api.AuditLogConfig> o) {
+checkUnnamed1383(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed1388() {
+buildUnnamed1384() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1388(core.List<core.String> o) {
+checkUnnamed1384(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -82,8 +81,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed1387();
-    o.exemptedMembers = buildUnnamed1388();
+    o.auditLogConfigs = buildUnnamed1383();
+    o.exemptedMembers = buildUnnamed1384();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -93,21 +92,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed1387(o.auditLogConfigs);
-    checkUnnamed1388(o.exemptedMembers);
+    checkUnnamed1383(o.auditLogConfigs);
+    checkUnnamed1384(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed1389() {
+buildUnnamed1385() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1389(core.List<core.String> o) {
+checkUnnamed1385(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -118,7 +117,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed1389();
+    o.exemptedMembers = buildUnnamed1385();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -128,20 +127,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed1389(o.exemptedMembers);
+    checkUnnamed1385(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed1390() {
+buildUnnamed1386() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1390(core.List<core.String> o) {
+checkUnnamed1386(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -153,7 +152,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed1390();
+    o.members = buildUnnamed1386();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -164,92 +163,23 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed1390(o.members);
+    checkUnnamed1386(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-core.int buildCounterCloudAuditOptions = 0;
-buildCloudAuditOptions() {
-  var o = new api.CloudAuditOptions();
-  buildCounterCloudAuditOptions++;
-  if (buildCounterCloudAuditOptions < 3) {
-    o.logName = "foo";
-  }
-  buildCounterCloudAuditOptions--;
+buildUnnamed1387() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
   return o;
 }
 
-checkCloudAuditOptions(api.CloudAuditOptions o) {
-  buildCounterCloudAuditOptions++;
-  if (buildCounterCloudAuditOptions < 3) {
-    unittest.expect(o.logName, unittest.equals('foo'));
-  }
-  buildCounterCloudAuditOptions--;
-}
-
-buildUnnamed1391() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1391(core.List<core.String> o) {
+checkUnnamed1387(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterCondition = 0;
-buildCondition() {
-  var o = new api.Condition();
-  buildCounterCondition++;
-  if (buildCounterCondition < 3) {
-    o.iam = "foo";
-    o.op = "foo";
-    o.svc = "foo";
-    o.sys = "foo";
-    o.value = "foo";
-    o.values = buildUnnamed1391();
-  }
-  buildCounterCondition--;
-  return o;
-}
-
-checkCondition(api.Condition o) {
-  buildCounterCondition++;
-  if (buildCounterCondition < 3) {
-    unittest.expect(o.iam, unittest.equals('foo'));
-    unittest.expect(o.op, unittest.equals('foo'));
-    unittest.expect(o.svc, unittest.equals('foo'));
-    unittest.expect(o.sys, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed1391(o.values);
-  }
-  buildCounterCondition--;
-}
-
-core.int buildCounterCounterOptions = 0;
-buildCounterOptions() {
-  var o = new api.CounterOptions();
-  buildCounterCounterOptions++;
-  if (buildCounterCounterOptions < 3) {
-    o.field = "foo";
-    o.metric = "foo";
-  }
-  buildCounterCounterOptions--;
-  return o;
-}
-
-checkCounterOptions(api.CounterOptions o) {
-  buildCounterCounterOptions++;
-  if (buildCounterCounterOptions < 3) {
-    unittest.expect(o.field, unittest.equals('foo'));
-    unittest.expect(o.metric, unittest.equals('foo'));
-  }
-  buildCounterCounterOptions--;
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
 }
 
 core.int buildCounterCryptoKey = 0;
@@ -258,6 +188,7 @@
   buildCounterCryptoKey++;
   if (buildCounterCryptoKey < 3) {
     o.createTime = "foo";
+    o.labels = buildUnnamed1387();
     o.name = "foo";
     o.nextRotationTime = "foo";
     o.primary = buildCryptoKeyVersion();
@@ -272,6 +203,7 @@
   buildCounterCryptoKey++;
   if (buildCounterCryptoKey < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
+    checkUnnamed1387(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nextRotationTime, unittest.equals('foo'));
     checkCryptoKeyVersion(o.primary);
@@ -308,25 +240,6 @@
   buildCounterCryptoKeyVersion--;
 }
 
-core.int buildCounterDataAccessOptions = 0;
-buildDataAccessOptions() {
-  var o = new api.DataAccessOptions();
-  buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-    o.logMode = "foo";
-  }
-  buildCounterDataAccessOptions--;
-  return o;
-}
-
-checkDataAccessOptions(api.DataAccessOptions o) {
-  buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-    unittest.expect(o.logMode, unittest.equals('foo'));
-  }
-  buildCounterDataAccessOptions--;
-}
-
 core.int buildCounterDecryptRequest = 0;
 buildDecryptRequest() {
   var o = new api.DecryptRequest();
@@ -371,16 +284,14 @@
 buildDestroyCryptoKeyVersionRequest() {
   var o = new api.DestroyCryptoKeyVersionRequest();
   buildCounterDestroyCryptoKeyVersionRequest++;
-  if (buildCounterDestroyCryptoKeyVersionRequest < 3) {
-  }
+  if (buildCounterDestroyCryptoKeyVersionRequest < 3) {}
   buildCounterDestroyCryptoKeyVersionRequest--;
   return o;
 }
 
 checkDestroyCryptoKeyVersionRequest(api.DestroyCryptoKeyVersionRequest o) {
   buildCounterDestroyCryptoKeyVersionRequest++;
-  if (buildCounterDestroyCryptoKeyVersionRequest < 3) {
-  }
+  if (buildCounterDestroyCryptoKeyVersionRequest < 3) {}
   buildCounterDestroyCryptoKeyVersionRequest--;
 }
 
@@ -472,14 +383,14 @@
   buildCounterKeyRing--;
 }
 
-buildUnnamed1392() {
+buildUnnamed1388() {
   var o = new core.List<api.CryptoKeyVersion>();
   o.add(buildCryptoKeyVersion());
   o.add(buildCryptoKeyVersion());
   return o;
 }
 
-checkUnnamed1392(core.List<api.CryptoKeyVersion> o) {
+checkUnnamed1388(core.List<api.CryptoKeyVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCryptoKeyVersion(o[0]);
   checkCryptoKeyVersion(o[1]);
@@ -490,7 +401,7 @@
   var o = new api.ListCryptoKeyVersionsResponse();
   buildCounterListCryptoKeyVersionsResponse++;
   if (buildCounterListCryptoKeyVersionsResponse < 3) {
-    o.cryptoKeyVersions = buildUnnamed1392();
+    o.cryptoKeyVersions = buildUnnamed1388();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -501,21 +412,21 @@
 checkListCryptoKeyVersionsResponse(api.ListCryptoKeyVersionsResponse o) {
   buildCounterListCryptoKeyVersionsResponse++;
   if (buildCounterListCryptoKeyVersionsResponse < 3) {
-    checkUnnamed1392(o.cryptoKeyVersions);
+    checkUnnamed1388(o.cryptoKeyVersions);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListCryptoKeyVersionsResponse--;
 }
 
-buildUnnamed1393() {
+buildUnnamed1389() {
   var o = new core.List<api.CryptoKey>();
   o.add(buildCryptoKey());
   o.add(buildCryptoKey());
   return o;
 }
 
-checkUnnamed1393(core.List<api.CryptoKey> o) {
+checkUnnamed1389(core.List<api.CryptoKey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCryptoKey(o[0]);
   checkCryptoKey(o[1]);
@@ -526,7 +437,7 @@
   var o = new api.ListCryptoKeysResponse();
   buildCounterListCryptoKeysResponse++;
   if (buildCounterListCryptoKeysResponse < 3) {
-    o.cryptoKeys = buildUnnamed1393();
+    o.cryptoKeys = buildUnnamed1389();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -537,21 +448,21 @@
 checkListCryptoKeysResponse(api.ListCryptoKeysResponse o) {
   buildCounterListCryptoKeysResponse++;
   if (buildCounterListCryptoKeysResponse < 3) {
-    checkUnnamed1393(o.cryptoKeys);
+    checkUnnamed1389(o.cryptoKeys);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListCryptoKeysResponse--;
 }
 
-buildUnnamed1394() {
+buildUnnamed1390() {
   var o = new core.List<api.KeyRing>();
   o.add(buildKeyRing());
   o.add(buildKeyRing());
   return o;
 }
 
-checkUnnamed1394(core.List<api.KeyRing> o) {
+checkUnnamed1390(core.List<api.KeyRing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyRing(o[0]);
   checkKeyRing(o[1]);
@@ -562,7 +473,7 @@
   var o = new api.ListKeyRingsResponse();
   buildCounterListKeyRingsResponse++;
   if (buildCounterListKeyRingsResponse < 3) {
-    o.keyRings = buildUnnamed1394();
+    o.keyRings = buildUnnamed1390();
     o.nextPageToken = "foo";
     o.totalSize = 42;
   }
@@ -573,21 +484,21 @@
 checkListKeyRingsResponse(api.ListKeyRingsResponse o) {
   buildCounterListKeyRingsResponse++;
   if (buildCounterListKeyRingsResponse < 3) {
-    checkUnnamed1394(o.keyRings);
+    checkUnnamed1390(o.keyRings);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterListKeyRingsResponse--;
 }
 
-buildUnnamed1395() {
+buildUnnamed1391() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed1395(core.List<api.Location> o) {
+checkUnnamed1391(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -598,7 +509,7 @@
   var o = new api.ListLocationsResponse();
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    o.locations = buildUnnamed1395();
+    o.locations = buildUnnamed1391();
     o.nextPageToken = "foo";
   }
   buildCounterListLocationsResponse--;
@@ -608,36 +519,52 @@
 checkListLocationsResponse(api.ListLocationsResponse o) {
   buildCounterListLocationsResponse++;
   if (buildCounterListLocationsResponse < 3) {
-    checkUnnamed1395(o.locations);
+    checkUnnamed1391(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLocationsResponse--;
 }
 
-buildUnnamed1396() {
+buildUnnamed1392() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1396(core.Map<core.String, core.String> o) {
+checkUnnamed1392(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1397() {
+buildUnnamed1393() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1397(core.Map<core.String, core.Object> o) {
+checkUnnamed1393(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterLocation = 0;
@@ -645,9 +572,9 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.labels = buildUnnamed1396();
+    o.labels = buildUnnamed1392();
     o.locationId = "foo";
-    o.metadata = buildUnnamed1397();
+    o.metadata = buildUnnamed1393();
     o.name = "foo";
   }
   buildCounterLocation--;
@@ -657,86 +584,49 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed1396(o.labels);
+    checkUnnamed1392(o.labels);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkUnnamed1397(o.metadata);
+    checkUnnamed1393(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLocation--;
 }
 
-core.int buildCounterLogConfig = 0;
-buildLogConfig() {
-  var o = new api.LogConfig();
-  buildCounterLogConfig++;
-  if (buildCounterLogConfig < 3) {
-    o.cloudAudit = buildCloudAuditOptions();
-    o.counter = buildCounterOptions();
-    o.dataAccess = buildDataAccessOptions();
-  }
-  buildCounterLogConfig--;
-  return o;
-}
-
-checkLogConfig(api.LogConfig o) {
-  buildCounterLogConfig++;
-  if (buildCounterLogConfig < 3) {
-    checkCloudAuditOptions(o.cloudAudit);
-    checkCounterOptions(o.counter);
-    checkDataAccessOptions(o.dataAccess);
-  }
-  buildCounterLogConfig--;
-}
-
-buildUnnamed1398() {
+buildUnnamed1394() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed1398(core.List<api.AuditConfig> o) {
+checkUnnamed1394(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed1399() {
+buildUnnamed1395() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1399(core.List<api.Binding> o) {
+checkUnnamed1395(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
 }
 
-buildUnnamed1400() {
-  var o = new core.List<api.Rule>();
-  o.add(buildRule());
-  o.add(buildRule());
-  return o;
-}
-
-checkUnnamed1400(core.List<api.Rule> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
-}
-
 core.int buildCounterPolicy = 0;
 buildPolicy() {
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed1398();
-    o.bindings = buildUnnamed1399();
+    o.auditConfigs = buildUnnamed1394();
+    o.bindings = buildUnnamed1395();
     o.etag = "foo";
     o.iamOwned = true;
-    o.rules = buildUnnamed1400();
     o.version = 42;
   }
   buildCounterPolicy--;
@@ -746,11 +636,10 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1398(o.auditConfigs);
-    checkUnnamed1399(o.bindings);
+    checkUnnamed1394(o.auditConfigs);
+    checkUnnamed1395(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed1400(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
@@ -760,115 +649,17 @@
 buildRestoreCryptoKeyVersionRequest() {
   var o = new api.RestoreCryptoKeyVersionRequest();
   buildCounterRestoreCryptoKeyVersionRequest++;
-  if (buildCounterRestoreCryptoKeyVersionRequest < 3) {
-  }
+  if (buildCounterRestoreCryptoKeyVersionRequest < 3) {}
   buildCounterRestoreCryptoKeyVersionRequest--;
   return o;
 }
 
 checkRestoreCryptoKeyVersionRequest(api.RestoreCryptoKeyVersionRequest o) {
   buildCounterRestoreCryptoKeyVersionRequest++;
-  if (buildCounterRestoreCryptoKeyVersionRequest < 3) {
-  }
+  if (buildCounterRestoreCryptoKeyVersionRequest < 3) {}
   buildCounterRestoreCryptoKeyVersionRequest--;
 }
 
-buildUnnamed1401() {
-  var o = new core.List<api.Condition>();
-  o.add(buildCondition());
-  o.add(buildCondition());
-  return o;
-}
-
-checkUnnamed1401(core.List<api.Condition> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
-}
-
-buildUnnamed1402() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1402(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1403() {
-  var o = new core.List<api.LogConfig>();
-  o.add(buildLogConfig());
-  o.add(buildLogConfig());
-  return o;
-}
-
-checkUnnamed1403(core.List<api.LogConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkLogConfig(o[0]);
-  checkLogConfig(o[1]);
-}
-
-buildUnnamed1404() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1404(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1405() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1405(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterRule = 0;
-buildRule() {
-  var o = new api.Rule();
-  buildCounterRule++;
-  if (buildCounterRule < 3) {
-    o.action = "foo";
-    o.conditions = buildUnnamed1401();
-    o.description = "foo";
-    o.in_ = buildUnnamed1402();
-    o.logConfig = buildUnnamed1403();
-    o.notIn = buildUnnamed1404();
-    o.permissions = buildUnnamed1405();
-  }
-  buildCounterRule--;
-  return o;
-}
-
-checkRule(api.Rule o) {
-  buildCounterRule++;
-  if (buildCounterRule < 3) {
-    unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed1401(o.conditions);
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1402(o.in_);
-    checkUnnamed1403(o.logConfig);
-    checkUnnamed1404(o.notIn);
-    checkUnnamed1405(o.permissions);
-  }
-  buildCounterRule--;
-}
-
 core.int buildCounterSetIamPolicyRequest = 0;
 buildSetIamPolicyRequest() {
   var o = new api.SetIamPolicyRequest();
@@ -890,14 +681,14 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed1406() {
+buildUnnamed1396() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1406(core.List<core.String> o) {
+checkUnnamed1396(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -908,7 +699,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1406();
+    o.permissions = buildUnnamed1396();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -917,19 +708,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1406(o.permissions);
+    checkUnnamed1396(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1407() {
+buildUnnamed1397() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1407(core.List<core.String> o) {
+checkUnnamed1397(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -940,7 +731,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1407();
+    o.permissions = buildUnnamed1397();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -949,7 +740,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1407(o.permissions);
+    checkUnnamed1397(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -965,7 +756,8 @@
   return o;
 }
 
-checkUpdateCryptoKeyPrimaryVersionRequest(api.UpdateCryptoKeyPrimaryVersionRequest o) {
+checkUpdateCryptoKeyPrimaryVersionRequest(
+    api.UpdateCryptoKeyPrimaryVersionRequest o) {
   buildCounterUpdateCryptoKeyPrimaryVersionRequest++;
   if (buildCounterUpdateCryptoKeyPrimaryVersionRequest < 3) {
     unittest.expect(o.cryptoKeyVersionId, unittest.equals('foo'));
@@ -973,7 +765,6 @@
   buildCounterUpdateCryptoKeyPrimaryVersionRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AuditConfig", () {
     unittest.test("to-json--from-json", () {
@@ -983,7 +774,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLogConfig();
@@ -992,7 +782,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -1001,34 +790,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-CloudAuditOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCloudAuditOptions();
-      var od = new api.CloudAuditOptions.fromJson(o.toJson());
-      checkCloudAuditOptions(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Condition", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCondition();
-      var od = new api.Condition.fromJson(o.toJson());
-      checkCondition(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-CounterOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCounterOptions();
-      var od = new api.CounterOptions.fromJson(o.toJson());
-      checkCounterOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-CryptoKey", () {
     unittest.test("to-json--from-json", () {
       var o = buildCryptoKey();
@@ -1037,7 +798,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CryptoKeyVersion", () {
     unittest.test("to-json--from-json", () {
       var o = buildCryptoKeyVersion();
@@ -1046,16 +806,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-DataAccessOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildDataAccessOptions();
-      var od = new api.DataAccessOptions.fromJson(o.toJson());
-      checkDataAccessOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-DecryptRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDecryptRequest();
@@ -1064,7 +814,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DecryptResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDecryptResponse();
@@ -1073,7 +822,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DestroyCryptoKeyVersionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDestroyCryptoKeyVersionRequest();
@@ -1082,7 +830,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EncryptRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEncryptRequest();
@@ -1091,7 +838,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EncryptResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEncryptResponse();
@@ -1100,7 +846,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Expr", () {
     unittest.test("to-json--from-json", () {
       var o = buildExpr();
@@ -1109,7 +854,6 @@
     });
   });
 
-
   unittest.group("obj-schema-KeyRing", () {
     unittest.test("to-json--from-json", () {
       var o = buildKeyRing();
@@ -1118,7 +862,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListCryptoKeyVersionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListCryptoKeyVersionsResponse();
@@ -1127,7 +870,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListCryptoKeysResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListCryptoKeysResponse();
@@ -1136,7 +878,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListKeyRingsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListKeyRingsResponse();
@@ -1145,7 +886,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListLocationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListLocationsResponse();
@@ -1154,7 +894,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Location", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocation();
@@ -1163,16 +902,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-LogConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildLogConfig();
-      var od = new api.LogConfig.fromJson(o.toJson());
-      checkLogConfig(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -1181,7 +910,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestoreCryptoKeyVersionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestoreCryptoKeyVersionRequest();
@@ -1190,16 +918,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-Rule", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildRule();
-      var od = new api.Rule.fromJson(o.toJson());
-      checkRule(od);
-    });
-  });
-
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -1208,7 +926,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -1217,7 +934,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -1226,30 +942,31 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateCryptoKeyPrimaryVersionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateCryptoKeyPrimaryVersionRequest();
-      var od = new api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(o.toJson());
+      var od =
+          new api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(o.toJson());
       checkUpdateCryptoKeyPrimaryVersionRequest(od);
     });
   });
 
-
   unittest.group("resource-ProjectsLocationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsResourceApi res = new api.CloudkmsApi(mock).projects.locations;
+      api.ProjectsLocationsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1263,16 +980,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLocation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1283,21 +1001,23 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsResourceApi res = new api.CloudkmsApi(mock).projects.locations;
+      api.ProjectsLocationsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations;
       var arg_name = "foo";
-      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1311,36 +1031,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLocationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListLocationsResponse response) {
+      res
+          .list(arg_name,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLocationsResponse response) {
         checkListLocationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsLocationsKeyRingsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings;
+      api.ProjectsLocationsKeyRingsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings;
       var arg_request = buildKeyRing();
       var arg_parent = "foo";
       var arg_keyRingId = "foo";
@@ -1352,9 +1078,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1368,39 +1096,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["keyRingId"].first, unittest.equals(arg_keyRingId));
-
+        unittest.expect(
+            queryMap["keyRingId"].first, unittest.equals(arg_keyRingId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildKeyRing());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent, keyRingId: arg_keyRingId).then(unittest.expectAsync1(((api.KeyRing response) {
+      res
+          .create(arg_request, arg_parent, keyRingId: arg_keyRingId)
+          .then(unittest.expectAsync1(((api.KeyRing response) {
         checkKeyRing(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings;
+      api.ProjectsLocationsKeyRingsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1414,16 +1148,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildKeyRing());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1434,18 +1169,20 @@
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings;
+      api.ProjectsLocationsKeyRingsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings;
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1459,40 +1196,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings;
+      api.ProjectsLocationsKeyRingsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings;
       var arg_parent = "foo";
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1506,31 +1248,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListKeyRingsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListKeyRingsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListKeyRingsResponse response) {
         checkListKeyRingsResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings;
+      api.ProjectsLocationsKeyRingsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1541,9 +1288,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1557,29 +1306,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings;
+      api.ProjectsLocationsKeyRingsResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1590,9 +1342,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1606,33 +1360,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsLocationsKeyRingsCryptoKeysResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildCryptoKey();
       var arg_parent = "foo";
       var arg_cryptoKeyId = "foo";
@@ -1644,9 +1398,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1660,30 +1416,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["cryptoKeyId"].first, unittest.equals(arg_cryptoKeyId));
-
+        unittest.expect(
+            queryMap["cryptoKeyId"].first, unittest.equals(arg_cryptoKeyId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent, cryptoKeyId: arg_cryptoKeyId).then(unittest.expectAsync1(((api.CryptoKey response) {
+      res
+          .create(arg_request, arg_parent, cryptoKeyId: arg_cryptoKeyId)
+          .then(unittest.expectAsync1(((api.CryptoKey response) {
         checkCryptoKey(response);
       })));
     });
 
     unittest.test("method--decrypt", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildDecryptRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1694,9 +1454,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1710,29 +1472,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDecryptResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.decrypt(arg_request, arg_name).then(unittest.expectAsync1(((api.DecryptResponse response) {
+      res
+          .decrypt(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.DecryptResponse response) {
         checkDecryptResponse(response);
       })));
     });
 
     unittest.test("method--encrypt", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildEncryptRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1743,9 +1508,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1759,38 +1526,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEncryptResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.encrypt(arg_request, arg_name).then(unittest.expectAsync1(((api.EncryptResponse response) {
+      res
+          .encrypt(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.EncryptResponse response) {
         checkEncryptResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1804,16 +1576,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKey());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1824,18 +1597,20 @@
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1849,40 +1624,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_parent = "foo";
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1896,31 +1676,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListCryptoKeysResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListCryptoKeysResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListCryptoKeysResponse response) {
         checkListCryptoKeysResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildCryptoKey();
       var arg_name = "foo";
       var arg_updateMask = "foo";
@@ -1932,9 +1717,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1948,30 +1735,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.CryptoKey response) {
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.CryptoKey response) {
         checkCryptoKey(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1982,9 +1773,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1998,29 +1791,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2031,9 +1827,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2047,29 +1845,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--updatePrimaryVersion", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
+      api.ProjectsLocationsKeyRingsCryptoKeysResourceApi res =
+          new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys;
       var arg_request = buildUpdateCryptoKeyPrimaryVersionRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2080,9 +1880,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2096,33 +1898,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.updatePrimaryVersion(arg_request, arg_name).then(unittest.expectAsync1(((api.CryptoKey response) {
+      res
+          .updatePrimaryVersion(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.CryptoKey response) {
         checkCryptoKey(response);
       })));
     });
-
   });
 
-
-  unittest.group("resource-ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi", () {
+  unittest.group(
+      "resource-ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi",
+      () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys.cryptoKeyVersions;
+      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res =
+          new api.CloudkmsApi(mock)
+              .projects
+              .locations
+              .keyRings
+              .cryptoKeys
+              .cryptoKeyVersions;
       var arg_request = buildCryptoKeyVersion();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2133,9 +1943,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2149,29 +1961,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKeyVersion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
         checkCryptoKeyVersion(response);
       })));
     });
 
     unittest.test("method--destroy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys.cryptoKeyVersions;
+      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res =
+          new api.CloudkmsApi(mock)
+              .projects
+              .locations
+              .keyRings
+              .cryptoKeys
+              .cryptoKeyVersions;
       var arg_request = buildDestroyCryptoKeyVersionRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2182,9 +2002,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2198,38 +2020,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKeyVersion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.destroy(arg_request, arg_name).then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
+      res
+          .destroy(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
         checkCryptoKeyVersion(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys.cryptoKeyVersions;
+      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res =
+          new api.CloudkmsApi(mock)
+              .projects
+              .locations
+              .keyRings
+              .cryptoKeys
+              .cryptoKeyVersions;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2243,40 +2075,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKeyVersion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
         checkCryptoKeyVersion(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys.cryptoKeyVersions;
+      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res =
+          new api.CloudkmsApi(mock)
+              .projects
+              .locations
+              .keyRings
+              .cryptoKeys
+              .cryptoKeyVersions;
       var arg_parent = "foo";
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2290,31 +2132,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListCryptoKeyVersionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListCryptoKeyVersionsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.ListCryptoKeyVersionsResponse response) {
         checkListCryptoKeyVersionsResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys.cryptoKeyVersions;
+      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res =
+          new api.CloudkmsApi(mock)
+              .projects
+              .locations
+              .keyRings
+              .cryptoKeys
+              .cryptoKeyVersions;
       var arg_request = buildCryptoKeyVersion();
       var arg_name = "foo";
       var arg_updateMask = "foo";
@@ -2326,9 +2179,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2342,30 +2197,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKeyVersion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
         checkCryptoKeyVersion(response);
       })));
     });
 
     unittest.test("method--restore", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res = new api.CloudkmsApi(mock).projects.locations.keyRings.cryptoKeys.cryptoKeyVersions;
+      api.ProjectsLocationsKeyRingsCryptoKeysCryptoKeyVersionsResourceApi res =
+          new api.CloudkmsApi(mock)
+              .projects
+              .locations
+              .keyRings
+              .cryptoKeys
+              .cryptoKeyVersions;
       var arg_request = buildRestoreCryptoKeyVersionRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2376,9 +2240,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2392,27 +2258,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCryptoKeyVersion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.restore(arg_request, arg_name).then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
+      res
+          .restore(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.CryptoKeyVersion response) {
         checkCryptoKeyVersion(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudresourcemanager/v1_test.dart b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
index 2a2d346..d0bbbf4 100644
--- a/generated/googleapis/test/cloudresourcemanager/v1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudresourcemanager.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudresourcemanager/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -70,14 +69,14 @@
   buildCounterAncestor--;
 }
 
-buildUnnamed1843() {
+buildUnnamed1841() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed1843(core.List<api.AuditLogConfig> o) {
+checkUnnamed1841(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
@@ -88,7 +87,7 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed1843();
+    o.auditLogConfigs = buildUnnamed1841();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -98,20 +97,20 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed1843(o.auditLogConfigs);
+    checkUnnamed1841(o.auditLogConfigs);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed1844() {
+buildUnnamed1842() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1844(core.List<core.String> o) {
+checkUnnamed1842(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -122,7 +121,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed1844();
+    o.exemptedMembers = buildUnnamed1842();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -132,20 +131,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed1844(o.exemptedMembers);
+    checkUnnamed1842(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed1845() {
+buildUnnamed1843() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1845(core.List<core.String> o) {
+checkUnnamed1843(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -156,7 +155,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed1845();
+    o.members = buildUnnamed1843();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -166,7 +165,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed1845(o.members);
+    checkUnnamed1843(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -176,16 +175,14 @@
 buildBooleanConstraint() {
   var o = new api.BooleanConstraint();
   buildCounterBooleanConstraint++;
-  if (buildCounterBooleanConstraint < 3) {
-  }
+  if (buildCounterBooleanConstraint < 3) {}
   buildCounterBooleanConstraint--;
   return o;
 }
 
 checkBooleanConstraint(api.BooleanConstraint o) {
   buildCounterBooleanConstraint++;
-  if (buildCounterBooleanConstraint < 3) {
-  }
+  if (buildCounterBooleanConstraint < 3) {}
   buildCounterBooleanConstraint--;
 }
 
@@ -264,16 +261,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -325,27 +320,25 @@
 buildGetAncestryRequest() {
   var o = new api.GetAncestryRequest();
   buildCounterGetAncestryRequest++;
-  if (buildCounterGetAncestryRequest < 3) {
-  }
+  if (buildCounterGetAncestryRequest < 3) {}
   buildCounterGetAncestryRequest--;
   return o;
 }
 
 checkGetAncestryRequest(api.GetAncestryRequest o) {
   buildCounterGetAncestryRequest++;
-  if (buildCounterGetAncestryRequest < 3) {
-  }
+  if (buildCounterGetAncestryRequest < 3) {}
   buildCounterGetAncestryRequest--;
 }
 
-buildUnnamed1846() {
+buildUnnamed1844() {
   var o = new core.List<api.Ancestor>();
   o.add(buildAncestor());
   o.add(buildAncestor());
   return o;
 }
 
-checkUnnamed1846(core.List<api.Ancestor> o) {
+checkUnnamed1844(core.List<api.Ancestor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAncestor(o[0]);
   checkAncestor(o[1]);
@@ -356,7 +349,7 @@
   var o = new api.GetAncestryResponse();
   buildCounterGetAncestryResponse++;
   if (buildCounterGetAncestryResponse < 3) {
-    o.ancestor = buildUnnamed1846();
+    o.ancestor = buildUnnamed1844();
   }
   buildCounterGetAncestryResponse--;
   return o;
@@ -365,7 +358,7 @@
 checkGetAncestryResponse(api.GetAncestryResponse o) {
   buildCounterGetAncestryResponse++;
   if (buildCounterGetAncestryResponse < 3) {
-    checkUnnamed1846(o.ancestor);
+    checkUnnamed1844(o.ancestor);
   }
   buildCounterGetAncestryResponse--;
 }
@@ -393,16 +386,14 @@
 buildGetIamPolicyRequest() {
   var o = new api.GetIamPolicyRequest();
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
   return o;
 }
 
 checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
 }
 
@@ -425,14 +416,14 @@
   buildCounterGetOrgPolicyRequest--;
 }
 
-buildUnnamed1847() {
+buildUnnamed1845() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1847(core.List<core.String> o) {
+checkUnnamed1845(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -448,7 +439,7 @@
     o.origin = "foo";
     o.parent = "foo";
     o.reason = "foo";
-    o.restrictions = buildUnnamed1847();
+    o.restrictions = buildUnnamed1845();
   }
   buildCounterLien--;
   return o;
@@ -462,7 +453,7 @@
     unittest.expect(o.origin, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.reason, unittest.equals('foo'));
-    checkUnnamed1847(o.restrictions);
+    checkUnnamed1845(o.restrictions);
   }
   buildCounterLien--;
 }
@@ -479,7 +470,8 @@
   return o;
 }
 
-checkListAvailableOrgPolicyConstraintsRequest(api.ListAvailableOrgPolicyConstraintsRequest o) {
+checkListAvailableOrgPolicyConstraintsRequest(
+    api.ListAvailableOrgPolicyConstraintsRequest o) {
   buildCounterListAvailableOrgPolicyConstraintsRequest++;
   if (buildCounterListAvailableOrgPolicyConstraintsRequest < 3) {
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -488,14 +480,14 @@
   buildCounterListAvailableOrgPolicyConstraintsRequest--;
 }
 
-buildUnnamed1848() {
+buildUnnamed1846() {
   var o = new core.List<api.Constraint>();
   o.add(buildConstraint());
   o.add(buildConstraint());
   return o;
 }
 
-checkUnnamed1848(core.List<api.Constraint> o) {
+checkUnnamed1846(core.List<api.Constraint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConstraint(o[0]);
   checkConstraint(o[1]);
@@ -506,17 +498,18 @@
   var o = new api.ListAvailableOrgPolicyConstraintsResponse();
   buildCounterListAvailableOrgPolicyConstraintsResponse++;
   if (buildCounterListAvailableOrgPolicyConstraintsResponse < 3) {
-    o.constraints = buildUnnamed1848();
+    o.constraints = buildUnnamed1846();
     o.nextPageToken = "foo";
   }
   buildCounterListAvailableOrgPolicyConstraintsResponse--;
   return o;
 }
 
-checkListAvailableOrgPolicyConstraintsResponse(api.ListAvailableOrgPolicyConstraintsResponse o) {
+checkListAvailableOrgPolicyConstraintsResponse(
+    api.ListAvailableOrgPolicyConstraintsResponse o) {
   buildCounterListAvailableOrgPolicyConstraintsResponse++;
   if (buildCounterListAvailableOrgPolicyConstraintsResponse < 3) {
-    checkUnnamed1848(o.constraints);
+    checkUnnamed1846(o.constraints);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListAvailableOrgPolicyConstraintsResponse--;
@@ -541,14 +534,14 @@
   buildCounterListConstraint--;
 }
 
-buildUnnamed1849() {
+buildUnnamed1847() {
   var o = new core.List<api.Lien>();
   o.add(buildLien());
   o.add(buildLien());
   return o;
 }
 
-checkUnnamed1849(core.List<api.Lien> o) {
+checkUnnamed1847(core.List<api.Lien> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLien(o[0]);
   checkLien(o[1]);
@@ -559,7 +552,7 @@
   var o = new api.ListLiensResponse();
   buildCounterListLiensResponse++;
   if (buildCounterListLiensResponse < 3) {
-    o.liens = buildUnnamed1849();
+    o.liens = buildUnnamed1847();
     o.nextPageToken = "foo";
   }
   buildCounterListLiensResponse--;
@@ -569,7 +562,7 @@
 checkListLiensResponse(api.ListLiensResponse o) {
   buildCounterListLiensResponse++;
   if (buildCounterListLiensResponse < 3) {
-    checkUnnamed1849(o.liens);
+    checkUnnamed1847(o.liens);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLiensResponse--;
@@ -596,14 +589,14 @@
   buildCounterListOrgPoliciesRequest--;
 }
 
-buildUnnamed1850() {
+buildUnnamed1848() {
   var o = new core.List<api.OrgPolicy>();
   o.add(buildOrgPolicy());
   o.add(buildOrgPolicy());
   return o;
 }
 
-checkUnnamed1850(core.List<api.OrgPolicy> o) {
+checkUnnamed1848(core.List<api.OrgPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgPolicy(o[0]);
   checkOrgPolicy(o[1]);
@@ -615,7 +608,7 @@
   buildCounterListOrgPoliciesResponse++;
   if (buildCounterListOrgPoliciesResponse < 3) {
     o.nextPageToken = "foo";
-    o.policies = buildUnnamed1850();
+    o.policies = buildUnnamed1848();
   }
   buildCounterListOrgPoliciesResponse--;
   return o;
@@ -625,32 +618,32 @@
   buildCounterListOrgPoliciesResponse++;
   if (buildCounterListOrgPoliciesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1850(o.policies);
+    checkUnnamed1848(o.policies);
   }
   buildCounterListOrgPoliciesResponse--;
 }
 
-buildUnnamed1851() {
+buildUnnamed1849() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1851(core.List<core.String> o) {
+checkUnnamed1849(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1852() {
+buildUnnamed1850() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1852(core.List<core.String> o) {
+checkUnnamed1850(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -662,8 +655,8 @@
   buildCounterListPolicy++;
   if (buildCounterListPolicy < 3) {
     o.allValues = "foo";
-    o.allowedValues = buildUnnamed1851();
-    o.deniedValues = buildUnnamed1852();
+    o.allowedValues = buildUnnamed1849();
+    o.deniedValues = buildUnnamed1850();
     o.inheritFromParent = true;
     o.suggestedValue = "foo";
   }
@@ -675,22 +668,22 @@
   buildCounterListPolicy++;
   if (buildCounterListPolicy < 3) {
     unittest.expect(o.allValues, unittest.equals('foo'));
-    checkUnnamed1851(o.allowedValues);
-    checkUnnamed1852(o.deniedValues);
+    checkUnnamed1849(o.allowedValues);
+    checkUnnamed1850(o.deniedValues);
     unittest.expect(o.inheritFromParent, unittest.isTrue);
     unittest.expect(o.suggestedValue, unittest.equals('foo'));
   }
   buildCounterListPolicy--;
 }
 
-buildUnnamed1853() {
+buildUnnamed1851() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed1853(core.List<api.Project> o) {
+checkUnnamed1851(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -702,7 +695,7 @@
   buildCounterListProjectsResponse++;
   if (buildCounterListProjectsResponse < 3) {
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed1853();
+    o.projects = buildUnnamed1851();
   }
   buildCounterListProjectsResponse--;
   return o;
@@ -712,35 +705,67 @@
   buildCounterListProjectsResponse++;
   if (buildCounterListProjectsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1853(o.projects);
+    checkUnnamed1851(o.projects);
   }
   buildCounterListProjectsResponse--;
 }
 
-buildUnnamed1854() {
+buildUnnamed1852() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1854(core.Map<core.String, core.Object> o) {
+checkUnnamed1852(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1855() {
+buildUnnamed1853() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1855(core.Map<core.String, core.Object> o) {
+checkUnnamed1853(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -750,9 +775,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1854();
+    o.metadata = buildUnnamed1852();
     o.name = "foo";
-    o.response = buildUnnamed1855();
+    o.response = buildUnnamed1853();
   }
   buildCounterOperation--;
   return o;
@@ -763,9 +788,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1854(o.metadata);
+    checkUnnamed1852(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1855(o.response);
+    checkUnnamed1853(o.response);
   }
   buildCounterOperation--;
 }
@@ -847,27 +872,27 @@
   buildCounterOrganizationOwner--;
 }
 
-buildUnnamed1856() {
+buildUnnamed1854() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed1856(core.List<api.AuditConfig> o) {
+checkUnnamed1854(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed1857() {
+buildUnnamed1855() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1857(core.List<api.Binding> o) {
+checkUnnamed1855(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -878,8 +903,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed1856();
-    o.bindings = buildUnnamed1857();
+    o.auditConfigs = buildUnnamed1854();
+    o.bindings = buildUnnamed1855();
     o.etag = "foo";
     o.version = 42;
   }
@@ -890,22 +915,22 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1856(o.auditConfigs);
-    checkUnnamed1857(o.bindings);
+    checkUnnamed1854(o.auditConfigs);
+    checkUnnamed1855(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed1858() {
+buildUnnamed1856() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1858(core.Map<core.String, core.String> o) {
+checkUnnamed1856(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -917,7 +942,7 @@
   buildCounterProject++;
   if (buildCounterProject < 3) {
     o.createTime = "foo";
-    o.labels = buildUnnamed1858();
+    o.labels = buildUnnamed1856();
     o.lifecycleState = "foo";
     o.name = "foo";
     o.parent = buildResourceId();
@@ -932,7 +957,7 @@
   buildCounterProject++;
   if (buildCounterProject < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUnnamed1858(o.labels);
+    checkUnnamed1856(o.labels);
     unittest.expect(o.lifecycleState, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkResourceId(o.parent);
@@ -990,16 +1015,14 @@
 buildRestoreDefault() {
   var o = new api.RestoreDefault();
   buildCounterRestoreDefault++;
-  if (buildCounterRestoreDefault < 3) {
-  }
+  if (buildCounterRestoreDefault < 3) {}
   buildCounterRestoreDefault--;
   return o;
 }
 
 checkRestoreDefault(api.RestoreDefault o) {
   buildCounterRestoreDefault++;
-  if (buildCounterRestoreDefault < 3) {
-  }
+  if (buildCounterRestoreDefault < 3) {}
   buildCounterRestoreDefault--;
 }
 
@@ -1026,14 +1049,14 @@
   buildCounterSearchOrganizationsRequest--;
 }
 
-buildUnnamed1859() {
+buildUnnamed1857() {
   var o = new core.List<api.Organization>();
   o.add(buildOrganization());
   o.add(buildOrganization());
   return o;
 }
 
-checkUnnamed1859(core.List<api.Organization> o) {
+checkUnnamed1857(core.List<api.Organization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrganization(o[0]);
   checkOrganization(o[1]);
@@ -1045,7 +1068,7 @@
   buildCounterSearchOrganizationsResponse++;
   if (buildCounterSearchOrganizationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.organizations = buildUnnamed1859();
+    o.organizations = buildUnnamed1857();
   }
   buildCounterSearchOrganizationsResponse--;
   return o;
@@ -1055,7 +1078,7 @@
   buildCounterSearchOrganizationsResponse++;
   if (buildCounterSearchOrganizationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1859(o.organizations);
+    checkUnnamed1857(o.organizations);
   }
   buildCounterSearchOrganizationsResponse--;
 }
@@ -1100,30 +1123,46 @@
   buildCounterSetOrgPolicyRequest--;
 }
 
-buildUnnamed1860() {
+buildUnnamed1858() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1860(core.Map<core.String, core.Object> o) {
+checkUnnamed1858(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1861() {
+buildUnnamed1859() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1860());
-  o.add(buildUnnamed1860());
+  o.add(buildUnnamed1858());
+  o.add(buildUnnamed1858());
   return o;
 }
 
-checkUnnamed1861(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1859(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1860(o[0]);
-  checkUnnamed1860(o[1]);
+  checkUnnamed1858(o[0]);
+  checkUnnamed1858(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1132,7 +1171,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1861();
+    o.details = buildUnnamed1859();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1143,20 +1182,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1861(o.details);
+    checkUnnamed1859(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed1862() {
+buildUnnamed1860() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1862(core.List<core.String> o) {
+checkUnnamed1860(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1167,7 +1206,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1862();
+    o.permissions = buildUnnamed1860();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -1176,19 +1215,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1862(o.permissions);
+    checkUnnamed1860(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1863() {
+buildUnnamed1861() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1863(core.List<core.String> o) {
+checkUnnamed1861(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1199,7 +1238,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1863();
+    o.permissions = buildUnnamed1861();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -1208,7 +1247,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1863(o.permissions);
+    checkUnnamed1861(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -1217,20 +1256,17 @@
 buildUndeleteProjectRequest() {
   var o = new api.UndeleteProjectRequest();
   buildCounterUndeleteProjectRequest++;
-  if (buildCounterUndeleteProjectRequest < 3) {
-  }
+  if (buildCounterUndeleteProjectRequest < 3) {}
   buildCounterUndeleteProjectRequest--;
   return o;
 }
 
 checkUndeleteProjectRequest(api.UndeleteProjectRequest o) {
   buildCounterUndeleteProjectRequest++;
-  if (buildCounterUndeleteProjectRequest < 3) {
-  }
+  if (buildCounterUndeleteProjectRequest < 3) {}
   buildCounterUndeleteProjectRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-Ancestor", () {
     unittest.test("to-json--from-json", () {
@@ -1240,7 +1276,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditConfig();
@@ -1249,7 +1284,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLogConfig();
@@ -1258,7 +1292,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -1267,7 +1300,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BooleanConstraint", () {
     unittest.test("to-json--from-json", () {
       var o = buildBooleanConstraint();
@@ -1276,7 +1308,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BooleanPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildBooleanPolicy();
@@ -1285,7 +1316,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClearOrgPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildClearOrgPolicyRequest();
@@ -1294,7 +1324,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Constraint", () {
     unittest.test("to-json--from-json", () {
       var o = buildConstraint();
@@ -1303,7 +1332,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -1312,7 +1340,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FolderOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildFolderOperation();
@@ -1321,7 +1348,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FolderOperationError", () {
     unittest.test("to-json--from-json", () {
       var o = buildFolderOperationError();
@@ -1330,7 +1356,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetAncestryRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetAncestryRequest();
@@ -1339,7 +1364,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetAncestryResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetAncestryResponse();
@@ -1348,7 +1372,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetEffectiveOrgPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetEffectiveOrgPolicyRequest();
@@ -1357,7 +1380,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetIamPolicyRequest();
@@ -1366,7 +1388,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetOrgPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetOrgPolicyRequest();
@@ -1375,7 +1396,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Lien", () {
     unittest.test("to-json--from-json", () {
       var o = buildLien();
@@ -1384,25 +1404,24 @@
     });
   });
 
-
   unittest.group("obj-schema-ListAvailableOrgPolicyConstraintsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildListAvailableOrgPolicyConstraintsRequest();
-      var od = new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(o.toJson());
+      var od =
+          new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(o.toJson());
       checkListAvailableOrgPolicyConstraintsRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-ListAvailableOrgPolicyConstraintsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListAvailableOrgPolicyConstraintsResponse();
-      var od = new api.ListAvailableOrgPolicyConstraintsResponse.fromJson(o.toJson());
+      var od = new api.ListAvailableOrgPolicyConstraintsResponse.fromJson(
+          o.toJson());
       checkListAvailableOrgPolicyConstraintsResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-ListConstraint", () {
     unittest.test("to-json--from-json", () {
       var o = buildListConstraint();
@@ -1411,7 +1430,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListLiensResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListLiensResponse();
@@ -1420,7 +1438,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOrgPoliciesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOrgPoliciesRequest();
@@ -1429,7 +1446,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOrgPoliciesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOrgPoliciesResponse();
@@ -1438,7 +1454,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildListPolicy();
@@ -1447,7 +1462,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListProjectsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListProjectsResponse();
@@ -1456,7 +1470,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1465,7 +1478,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OrgPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrgPolicy();
@@ -1474,7 +1486,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Organization", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrganization();
@@ -1483,7 +1494,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OrganizationOwner", () {
     unittest.test("to-json--from-json", () {
       var o = buildOrganizationOwner();
@@ -1492,7 +1502,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -1501,7 +1510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Project", () {
     unittest.test("to-json--from-json", () {
       var o = buildProject();
@@ -1510,7 +1518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectCreationStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectCreationStatus();
@@ -1519,7 +1526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceId", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceId();
@@ -1528,7 +1534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestoreDefault", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestoreDefault();
@@ -1537,7 +1542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchOrganizationsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchOrganizationsRequest();
@@ -1546,7 +1550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchOrganizationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchOrganizationsResponse();
@@ -1555,7 +1558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -1564,7 +1566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetOrgPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetOrgPolicyRequest();
@@ -1573,7 +1574,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1582,7 +1582,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -1591,7 +1590,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -1600,7 +1598,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UndeleteProjectRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUndeleteProjectRequest();
@@ -1609,12 +1606,11 @@
     });
   });
 
-
   unittest.group("resource-FoldersResourceApi", () {
     unittest.test("method--clearOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildClearOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1625,9 +1621,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1641,29 +1639,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.clearOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .clearOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--getEffectiveOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildGetEffectiveOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1674,9 +1675,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1690,29 +1693,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getEffectiveOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .getEffectiveOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--getOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildGetOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1723,9 +1729,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1739,42 +1747,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .getOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--listAvailableOrgPolicyConstraints", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildListAvailableOrgPolicyConstraintsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
+        var obj =
+            new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
         checkListAvailableOrgPolicyConstraintsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1788,29 +1802,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildListAvailableOrgPolicyConstraintsResponse());
+        var resp = convert.JSON
+            .encode(buildListAvailableOrgPolicyConstraintsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listAvailableOrgPolicyConstraints(arg_request, arg_resource).then(unittest.expectAsync1(((api.ListAvailableOrgPolicyConstraintsResponse response) {
+      res.listAvailableOrgPolicyConstraints(arg_request, arg_resource).then(
+          unittest.expectAsync1(
+              ((api.ListAvailableOrgPolicyConstraintsResponse response) {
         checkListAvailableOrgPolicyConstraintsResponse(response);
       })));
     });
 
     unittest.test("method--listOrgPolicies", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildListOrgPoliciesRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1821,9 +1839,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1837,29 +1857,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOrgPoliciesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listOrgPolicies(arg_request, arg_resource).then(unittest.expectAsync1(((api.ListOrgPoliciesResponse response) {
+      res
+          .listOrgPolicies(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.ListOrgPoliciesResponse response) {
         checkListOrgPoliciesResponse(response);
       })));
     });
 
     unittest.test("method--setOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildSetOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1870,9 +1893,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1886,31 +1911,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .setOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LiensResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.LiensResourceApi res = new api.CloudresourcemanagerApi(mock).liens;
       var arg_request = buildLien();
@@ -1922,9 +1947,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/liens"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/liens"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1937,16 +1964,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLien());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1957,7 +1985,6 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.LiensResourceApi res = new api.CloudresourcemanagerApi(mock).liens;
       var arg_name = "foo";
@@ -1966,9 +1993,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1982,16 +2011,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2002,20 +2032,21 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.LiensResourceApi res = new api.CloudresourcemanagerApi(mock).liens;
+      var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/liens"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/liens"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -2028,45 +2059,53 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLiensResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageToken: arg_pageToken, pageSize: arg_pageSize, parent: arg_parent).then(unittest.expectAsync1(((api.ListLiensResponse response) {
+      res
+          .list(
+              parent: arg_parent,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLiensResponse response) {
         checkListLiensResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.CloudresourcemanagerApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2080,16 +2119,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2098,15 +2138,13 @@
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-OrganizationsResourceApi", () {
     unittest.test("method--clearOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildClearOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2117,9 +2155,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2133,38 +2173,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.clearOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .clearOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2178,29 +2223,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrganization());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.Organization response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.Organization response) {
         checkOrganization(response);
       })));
     });
 
     unittest.test("method--getEffectiveOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildGetEffectiveOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2211,9 +2259,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2227,29 +2277,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getEffectiveOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .getEffectiveOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildGetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2260,9 +2313,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2276,29 +2331,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--getOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildGetOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2309,9 +2367,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2325,42 +2385,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .getOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--listAvailableOrgPolicyConstraints", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildListAvailableOrgPolicyConstraintsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
+        var obj =
+            new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
         checkListAvailableOrgPolicyConstraintsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2374,29 +2440,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildListAvailableOrgPolicyConstraintsResponse());
+        var resp = convert.JSON
+            .encode(buildListAvailableOrgPolicyConstraintsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listAvailableOrgPolicyConstraints(arg_request, arg_resource).then(unittest.expectAsync1(((api.ListAvailableOrgPolicyConstraintsResponse response) {
+      res.listAvailableOrgPolicyConstraints(arg_request, arg_resource).then(
+          unittest.expectAsync1(
+              ((api.ListAvailableOrgPolicyConstraintsResponse response) {
         checkListAvailableOrgPolicyConstraintsResponse(response);
       })));
     });
 
     unittest.test("method--listOrgPolicies", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildListOrgPoliciesRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2407,9 +2477,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2423,29 +2495,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOrgPoliciesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listOrgPolicies(arg_request, arg_resource).then(unittest.expectAsync1(((api.ListOrgPoliciesResponse response) {
+      res
+          .listOrgPolicies(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.ListOrgPoliciesResponse response) {
         checkListOrgPoliciesResponse(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildSearchOrganizationsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.SearchOrganizationsRequest.fromJson(json);
@@ -2455,9 +2530,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("v1/organizations:search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("v1/organizations:search"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -2470,29 +2547,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchOrganizationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchOrganizationsResponse response) {
+      res.search(arg_request).then(
+          unittest.expectAsync1(((api.SearchOrganizationsResponse response) {
         checkSearchOrganizationsResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2503,9 +2582,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2519,29 +2600,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--setOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildSetOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2552,9 +2636,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2568,29 +2654,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .setOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsResourceApi res = new api.CloudresourcemanagerApi(mock).organizations;
+      api.OrganizationsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).organizations;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2601,9 +2690,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2617,33 +2708,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--clearOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildClearOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2654,9 +2745,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2670,29 +2763,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.clearOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .clearOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildProject();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Project.fromJson(json);
@@ -2702,9 +2798,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/projects"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/projects"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -2717,38 +2815,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2764,38 +2867,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_projectId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_projectId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2811,29 +2919,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProject());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId).then(unittest.expectAsync1(((api.Project response) {
+      res
+          .get(arg_projectId)
+          .then(unittest.expectAsync1(((api.Project response) {
         checkProject(response);
       })));
     });
 
     unittest.test("method--getAncestry", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildGetAncestryRequest();
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2844,16 +2955,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":getAncestry", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals(":getAncestry"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals(":getAncestry"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -2866,29 +2981,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetAncestryResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getAncestry(arg_request, arg_projectId).then(unittest.expectAsync1(((api.GetAncestryResponse response) {
+      res
+          .getAncestry(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.GetAncestryResponse response) {
         checkGetAncestryResponse(response);
       })));
     });
 
     unittest.test("method--getEffectiveOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildGetEffectiveOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2899,9 +3017,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2915,29 +3035,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getEffectiveOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .getEffectiveOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildGetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2948,16 +3071,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":getIamPolicy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resource"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals(":getIamPolicy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals(":getIamPolicy"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -2970,29 +3097,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--getOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildGetOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3003,9 +3133,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3019,40 +3151,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .getOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
-      var arg_pageSize = 42;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/projects"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/projects"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -3065,45 +3202,56 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListProjectsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListProjectsResponse response) {
+      res
+          .list(
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListProjectsResponse response) {
         checkListProjectsResponse(response);
       })));
     });
 
     unittest.test("method--listAvailableOrgPolicyConstraints", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildListAvailableOrgPolicyConstraintsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
+        var obj =
+            new api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
         checkListAvailableOrgPolicyConstraintsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3117,29 +3265,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildListAvailableOrgPolicyConstraintsResponse());
+        var resp = convert.JSON
+            .encode(buildListAvailableOrgPolicyConstraintsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listAvailableOrgPolicyConstraints(arg_request, arg_resource).then(unittest.expectAsync1(((api.ListAvailableOrgPolicyConstraintsResponse response) {
+      res.listAvailableOrgPolicyConstraints(arg_request, arg_resource).then(
+          unittest.expectAsync1(
+              ((api.ListAvailableOrgPolicyConstraintsResponse response) {
         checkListAvailableOrgPolicyConstraintsResponse(response);
       })));
     });
 
     unittest.test("method--listOrgPolicies", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildListOrgPoliciesRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3150,9 +3302,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3166,29 +3320,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOrgPoliciesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listOrgPolicies(arg_request, arg_resource).then(unittest.expectAsync1(((api.ListOrgPoliciesResponse response) {
+      res
+          .listOrgPolicies(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.ListOrgPoliciesResponse response) {
         checkListOrgPoliciesResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3199,16 +3356,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":setIamPolicy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resource"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals(":setIamPolicy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals(":setIamPolicy"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -3221,29 +3382,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--setOrgPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildSetOrgPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3254,9 +3418,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3270,29 +3436,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOrgPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setOrgPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.OrgPolicy response) {
+      res
+          .setOrgPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.OrgPolicy response) {
         checkOrgPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3303,16 +3472,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":testIamPermissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resource"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals(":testIamPermissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals(":testIamPermissions"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -3325,29 +3498,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--undelete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildUndeleteProjectRequest();
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3358,16 +3533,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":undelete", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":undelete"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":undelete"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3380,29 +3559,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.undelete(arg_request, arg_projectId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .undelete(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsResourceApi res = new api.CloudresourcemanagerApi(mock).projects;
+      api.ProjectsResourceApi res =
+          new api.CloudresourcemanagerApi(mock).projects;
       var arg_request = buildProject();
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3413,9 +3595,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3431,27 +3615,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProject());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_projectId).then(unittest.expectAsync1(((api.Project response) {
+      res
+          .update(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.Project response) {
         checkProject(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart b/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart
index 7c6deeb..f68cda3 100644
--- a/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v2beta1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudresourcemanager.v2beta1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudresourcemanager/v2beta1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed88() {
+buildUnnamed83() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed88(core.List<api.AuditLogConfig> o) {
+checkUnnamed83(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
@@ -69,7 +68,7 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed88();
+    o.auditLogConfigs = buildUnnamed83();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -79,20 +78,20 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed88(o.auditLogConfigs);
+    checkUnnamed83(o.auditLogConfigs);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed89() {
+buildUnnamed84() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed89(core.List<core.String> o) {
+checkUnnamed84(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -103,7 +102,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed89();
+    o.exemptedMembers = buildUnnamed84();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -113,20 +112,20 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed89(o.exemptedMembers);
+    checkUnnamed84(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
 }
 
-buildUnnamed90() {
+buildUnnamed85() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed90(core.List<core.String> o) {
+checkUnnamed85(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -137,7 +136,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed90();
+    o.members = buildUnnamed85();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -147,7 +146,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed90(o.members);
+    checkUnnamed85(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -228,27 +227,25 @@
 buildGetIamPolicyRequest() {
   var o = new api.GetIamPolicyRequest();
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
   return o;
 }
 
 checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed91() {
+buildUnnamed86() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed91(core.List<api.Folder> o) {
+checkUnnamed86(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
@@ -259,7 +256,7 @@
   var o = new api.ListFoldersResponse();
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    o.folders = buildUnnamed91();
+    o.folders = buildUnnamed86();
     o.nextPageToken = "foo";
   }
   buildCounterListFoldersResponse--;
@@ -269,7 +266,7 @@
 checkListFoldersResponse(api.ListFoldersResponse o) {
   buildCounterListFoldersResponse++;
   if (buildCounterListFoldersResponse < 3) {
-    checkUnnamed91(o.folders);
+    checkUnnamed86(o.folders);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListFoldersResponse--;
@@ -294,30 +291,62 @@
   buildCounterMoveFolderRequest--;
 }
 
-buildUnnamed92() {
+buildUnnamed87() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed92(core.Map<core.String, core.Object> o) {
+checkUnnamed87(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed93() {
+buildUnnamed88() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed93(core.Map<core.String, core.Object> o) {
+checkUnnamed88(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -327,9 +356,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed92();
+    o.metadata = buildUnnamed87();
     o.name = "foo";
-    o.response = buildUnnamed93();
+    o.response = buildUnnamed88();
   }
   buildCounterOperation--;
   return o;
@@ -340,34 +369,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed92(o.metadata);
+    checkUnnamed87(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed93(o.response);
+    checkUnnamed88(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed94() {
+buildUnnamed89() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed94(core.List<api.AuditConfig> o) {
+checkUnnamed89(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed95() {
+buildUnnamed90() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed95(core.List<api.Binding> o) {
+checkUnnamed90(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -378,8 +407,8 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed94();
-    o.bindings = buildUnnamed95();
+    o.auditConfigs = buildUnnamed89();
+    o.bindings = buildUnnamed90();
     o.etag = "foo";
     o.version = 42;
   }
@@ -390,8 +419,8 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed94(o.auditConfigs);
-    checkUnnamed95(o.bindings);
+    checkUnnamed89(o.auditConfigs);
+    checkUnnamed90(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -444,14 +473,14 @@
   buildCounterSearchFoldersRequest--;
 }
 
-buildUnnamed96() {
+buildUnnamed91() {
   var o = new core.List<api.Folder>();
   o.add(buildFolder());
   o.add(buildFolder());
   return o;
 }
 
-checkUnnamed96(core.List<api.Folder> o) {
+checkUnnamed91(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFolder(o[0]);
   checkFolder(o[1]);
@@ -462,7 +491,7 @@
   var o = new api.SearchFoldersResponse();
   buildCounterSearchFoldersResponse++;
   if (buildCounterSearchFoldersResponse < 3) {
-    o.folders = buildUnnamed96();
+    o.folders = buildUnnamed91();
     o.nextPageToken = "foo";
   }
   buildCounterSearchFoldersResponse--;
@@ -472,7 +501,7 @@
 checkSearchFoldersResponse(api.SearchFoldersResponse o) {
   buildCounterSearchFoldersResponse++;
   if (buildCounterSearchFoldersResponse < 3) {
-    checkUnnamed96(o.folders);
+    checkUnnamed91(o.folders);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchFoldersResponse--;
@@ -499,30 +528,46 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed97() {
+buildUnnamed92() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed97(core.Map<core.String, core.Object> o) {
+checkUnnamed92(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed98() {
+buildUnnamed93() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed97());
-  o.add(buildUnnamed97());
+  o.add(buildUnnamed92());
+  o.add(buildUnnamed92());
   return o;
 }
 
-checkUnnamed98(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed93(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed97(o[0]);
-  checkUnnamed97(o[1]);
+  checkUnnamed92(o[0]);
+  checkUnnamed92(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -531,7 +576,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed98();
+    o.details = buildUnnamed93();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -542,20 +587,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed98(o.details);
+    checkUnnamed93(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed99() {
+buildUnnamed94() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed99(core.List<core.String> o) {
+checkUnnamed94(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -566,7 +611,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed99();
+    o.permissions = buildUnnamed94();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -575,19 +620,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed99(o.permissions);
+    checkUnnamed94(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed100() {
+buildUnnamed95() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed100(core.List<core.String> o) {
+checkUnnamed95(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -598,7 +643,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed100();
+    o.permissions = buildUnnamed95();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -607,7 +652,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed100(o.permissions);
+    checkUnnamed95(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -616,20 +661,17 @@
 buildUndeleteFolderRequest() {
   var o = new api.UndeleteFolderRequest();
   buildCounterUndeleteFolderRequest++;
-  if (buildCounterUndeleteFolderRequest < 3) {
-  }
+  if (buildCounterUndeleteFolderRequest < 3) {}
   buildCounterUndeleteFolderRequest--;
   return o;
 }
 
 checkUndeleteFolderRequest(api.UndeleteFolderRequest o) {
   buildCounterUndeleteFolderRequest++;
-  if (buildCounterUndeleteFolderRequest < 3) {
-  }
+  if (buildCounterUndeleteFolderRequest < 3) {}
   buildCounterUndeleteFolderRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AuditConfig", () {
     unittest.test("to-json--from-json", () {
@@ -639,7 +681,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLogConfig();
@@ -648,7 +689,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -657,7 +697,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Folder", () {
     unittest.test("to-json--from-json", () {
       var o = buildFolder();
@@ -666,7 +705,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FolderOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildFolderOperation();
@@ -675,7 +713,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FolderOperationError", () {
     unittest.test("to-json--from-json", () {
       var o = buildFolderOperationError();
@@ -684,7 +721,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetIamPolicyRequest();
@@ -693,7 +729,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListFoldersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListFoldersResponse();
@@ -702,7 +737,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MoveFolderRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildMoveFolderRequest();
@@ -711,7 +745,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -720,7 +753,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -729,7 +761,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectCreationStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectCreationStatus();
@@ -738,7 +769,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchFoldersRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchFoldersRequest();
@@ -747,7 +777,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchFoldersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchFoldersResponse();
@@ -756,7 +785,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -765,7 +793,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -774,7 +801,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -783,7 +809,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -792,7 +817,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UndeleteFolderRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUndeleteFolderRequest();
@@ -801,12 +825,11 @@
     });
   });
 
-
   unittest.group("resource-FoldersResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildFolder();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -817,9 +840,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v2beta1/folders"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v2beta1/folders"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -832,39 +857,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, parent: arg_parent).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, parent: arg_parent)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -878,16 +908,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFolder());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -898,18 +929,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -923,16 +956,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFolder());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -943,9 +977,9 @@
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildGetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -956,9 +990,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -972,41 +1008,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
-      var arg_showDeleted = true;
-      var arg_pageToken = "foo";
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_pageSize = 42;
       var arg_parent = "foo";
+      var arg_showDeleted = true;
+      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v2beta1/folders"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v2beta1/folders"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -1019,33 +1060,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
-
+        unittest.expect(
+            queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListFoldersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(showDeleted: arg_showDeleted, pageToken: arg_pageToken, pageSize: arg_pageSize, parent: arg_parent).then(unittest.expectAsync1(((api.ListFoldersResponse response) {
+      res
+          .list(
+              pageSize: arg_pageSize,
+              parent: arg_parent,
+              showDeleted: arg_showDeleted,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListFoldersResponse response) {
         checkListFoldersResponse(response);
       })));
     });
 
     unittest.test("method--move", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildMoveFolderRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1056,9 +1107,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1072,29 +1125,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.move(arg_request, arg_name).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .move(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildFolder();
       var arg_name = "foo";
       var arg_updateMask = "foo";
@@ -1106,9 +1162,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1122,30 +1180,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFolder());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Folder response) {
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Folder response) {
         checkFolder(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildSearchFoldersRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.SearchFoldersRequest.fromJson(json);
@@ -1155,9 +1217,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("v2beta1/folders:search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("v2beta1/folders:search"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -1170,29 +1234,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchFoldersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchFoldersResponse response) {
+      res
+          .search(arg_request)
+          .then(unittest.expectAsync1(((api.SearchFoldersResponse response) {
         checkSearchFoldersResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1203,9 +1270,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1219,29 +1288,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1252,9 +1324,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1268,29 +1342,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--undelete", () {
-
       var mock = new HttpServerMock();
-      api.FoldersResourceApi res = new api.CloudresourcemanagerApi(mock).folders;
+      api.FoldersResourceApi res =
+          new api.CloudresourcemanagerApi(mock).folders;
       var arg_request = buildUndeleteFolderRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1301,9 +1377,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v2beta1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v2beta1/"));
         pathOffset += 8;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1317,27 +1395,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFolder());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.undelete(arg_request, arg_name).then(unittest.expectAsync1(((api.Folder response) {
+      res
+          .undelete(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Folder response) {
         checkFolder(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudtrace/v1_test.dart b/generated/googleapis/test/cloudtrace/v1_test.dart
index 418fb4e..a92a36c 100644
--- a/generated/googleapis/test/cloudtrace/v1_test.dart
+++ b/generated/googleapis/test/cloudtrace/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudtrace.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudtrace/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -55,27 +54,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed210() {
+buildUnnamed205() {
   var o = new core.List<api.Trace>();
   o.add(buildTrace());
   o.add(buildTrace());
   return o;
 }
 
-checkUnnamed210(core.List<api.Trace> o) {
+checkUnnamed205(core.List<api.Trace> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrace(o[0]);
   checkTrace(o[1]);
@@ -87,7 +84,7 @@
   buildCounterListTracesResponse++;
   if (buildCounterListTracesResponse < 3) {
     o.nextPageToken = "foo";
-    o.traces = buildUnnamed210();
+    o.traces = buildUnnamed205();
   }
   buildCounterListTracesResponse--;
   return o;
@@ -97,19 +94,19 @@
   buildCounterListTracesResponse++;
   if (buildCounterListTracesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed210(o.traces);
+    checkUnnamed205(o.traces);
   }
   buildCounterListTracesResponse--;
 }
 
-buildUnnamed211() {
+buildUnnamed206() {
   var o = new core.List<api.TraceSpan>();
   o.add(buildTraceSpan());
   o.add(buildTraceSpan());
   return o;
 }
 
-checkUnnamed211(core.List<api.TraceSpan> o) {
+checkUnnamed206(core.List<api.TraceSpan> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTraceSpan(o[0]);
   checkTraceSpan(o[1]);
@@ -121,7 +118,7 @@
   buildCounterTrace++;
   if (buildCounterTrace < 3) {
     o.projectId = "foo";
-    o.spans = buildUnnamed211();
+    o.spans = buildUnnamed206();
     o.traceId = "foo";
   }
   buildCounterTrace--;
@@ -132,20 +129,20 @@
   buildCounterTrace++;
   if (buildCounterTrace < 3) {
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed211(o.spans);
+    checkUnnamed206(o.spans);
     unittest.expect(o.traceId, unittest.equals('foo'));
   }
   buildCounterTrace--;
 }
 
-buildUnnamed212() {
+buildUnnamed207() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed212(core.Map<core.String, core.String> o) {
+checkUnnamed207(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -158,7 +155,7 @@
   if (buildCounterTraceSpan < 3) {
     o.endTime = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed212();
+    o.labels = buildUnnamed207();
     o.name = "foo";
     o.parentSpanId = "foo";
     o.spanId = "foo";
@@ -173,7 +170,7 @@
   if (buildCounterTraceSpan < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed212(o.labels);
+    checkUnnamed207(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentSpanId, unittest.equals('foo'));
     unittest.expect(o.spanId, unittest.equals('foo'));
@@ -182,14 +179,14 @@
   buildCounterTraceSpan--;
 }
 
-buildUnnamed213() {
+buildUnnamed208() {
   var o = new core.List<api.Trace>();
   o.add(buildTrace());
   o.add(buildTrace());
   return o;
 }
 
-checkUnnamed213(core.List<api.Trace> o) {
+checkUnnamed208(core.List<api.Trace> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrace(o[0]);
   checkTrace(o[1]);
@@ -200,7 +197,7 @@
   var o = new api.Traces();
   buildCounterTraces++;
   if (buildCounterTraces < 3) {
-    o.traces = buildUnnamed213();
+    o.traces = buildUnnamed208();
   }
   buildCounterTraces--;
   return o;
@@ -209,12 +206,11 @@
 checkTraces(api.Traces o) {
   buildCounterTraces++;
   if (buildCounterTraces < 3) {
-    checkUnnamed213(o.traces);
+    checkUnnamed208(o.traces);
   }
   buildCounterTraces--;
 }
 
-
 main() {
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
@@ -224,7 +220,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListTracesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListTracesResponse();
@@ -233,7 +228,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Trace", () {
     unittest.test("to-json--from-json", () {
       var o = buildTrace();
@@ -242,7 +236,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TraceSpan", () {
     unittest.test("to-json--from-json", () {
       var o = buildTraceSpan();
@@ -251,7 +244,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Traces", () {
     unittest.test("to-json--from-json", () {
       var o = buildTraces();
@@ -260,10 +252,8 @@
     });
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--patchTraces", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.CloudtraceApi(mock).projects;
       var arg_request = buildTraces();
@@ -276,16 +266,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/traces", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/traces"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/traces"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -298,33 +292,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patchTraces(arg_request, arg_projectId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .patchTraces(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsTracesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTracesResourceApi res = new api.CloudtraceApi(mock).projects.traces;
+      api.ProjectsTracesResourceApi res =
+          new api.CloudtraceApi(mock).projects.traces;
       var arg_projectId = "foo";
       var arg_traceId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -332,16 +327,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/traces/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/traces/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/traces/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -357,34 +356,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTrace());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_traceId).then(unittest.expectAsync1(((api.Trace response) {
+      res
+          .get(arg_projectId, arg_traceId)
+          .then(unittest.expectAsync1(((api.Trace response) {
         checkTrace(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTracesResourceApi res = new api.CloudtraceApi(mock).projects.traces;
+      api.ProjectsTracesResourceApi res =
+          new api.CloudtraceApi(mock).projects.traces;
       var arg_projectId = "foo";
       var arg_filter = "foo";
       var arg_endTime = "foo";
-      var arg_pageToken = "foo";
       var arg_startTime = "foo";
+      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_view = "foo";
       var arg_orderBy = "foo";
@@ -393,16 +395,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/traces", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/traces"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/traces"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -415,34 +421,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["endTime"].first, unittest.equals(arg_endTime));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["startTime"].first, unittest.equals(arg_startTime));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(
+            queryMap["startTime"].first, unittest.equals(arg_startTime));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListTracesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, filter: arg_filter, endTime: arg_endTime, pageToken: arg_pageToken, startTime: arg_startTime, pageSize: arg_pageSize, view: arg_view, orderBy: arg_orderBy).then(unittest.expectAsync1(((api.ListTracesResponse response) {
+      res
+          .list(arg_projectId,
+              filter: arg_filter,
+              endTime: arg_endTime,
+              startTime: arg_startTime,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              view: arg_view,
+              orderBy: arg_orderBy)
+          .then(unittest.expectAsync1(((api.ListTracesResponse response) {
         checkListTracesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/cloudtrace/v2_test.dart b/generated/googleapis/test/cloudtrace/v2_test.dart
index 5c27958..70fa591 100644
--- a/generated/googleapis/test/cloudtrace/v2_test.dart
+++ b/generated/googleapis/test/cloudtrace/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.cloudtrace.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/cloudtrace/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -95,14 +94,14 @@
   buildCounterAttributeValue--;
 }
 
-buildUnnamed1104() {
+buildUnnamed1107() {
   var o = new core.Map<core.String, api.AttributeValue>();
   o["x"] = buildAttributeValue();
   o["y"] = buildAttributeValue();
   return o;
 }
 
-checkUnnamed1104(core.Map<core.String, api.AttributeValue> o) {
+checkUnnamed1107(core.Map<core.String, api.AttributeValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttributeValue(o["x"]);
   checkAttributeValue(o["y"]);
@@ -113,7 +112,7 @@
   var o = new api.Attributes();
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    o.attributeMap = buildUnnamed1104();
+    o.attributeMap = buildUnnamed1107();
     o.droppedAttributesCount = 42;
   }
   buildCounterAttributes--;
@@ -123,20 +122,20 @@
 checkAttributes(api.Attributes o) {
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    checkUnnamed1104(o.attributeMap);
+    checkUnnamed1107(o.attributeMap);
     unittest.expect(o.droppedAttributesCount, unittest.equals(42));
   }
   buildCounterAttributes--;
 }
 
-buildUnnamed1105() {
+buildUnnamed1108() {
   var o = new core.List<api.Span>();
   o.add(buildSpan());
   o.add(buildSpan());
   return o;
 }
 
-checkUnnamed1105(core.List<api.Span> o) {
+checkUnnamed1108(core.List<api.Span> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpan(o[0]);
   checkSpan(o[1]);
@@ -147,7 +146,7 @@
   var o = new api.BatchWriteSpansRequest();
   buildCounterBatchWriteSpansRequest++;
   if (buildCounterBatchWriteSpansRequest < 3) {
-    o.spans = buildUnnamed1105();
+    o.spans = buildUnnamed1108();
   }
   buildCounterBatchWriteSpansRequest--;
   return o;
@@ -156,7 +155,7 @@
 checkBatchWriteSpansRequest(api.BatchWriteSpansRequest o) {
   buildCounterBatchWriteSpansRequest++;
   if (buildCounterBatchWriteSpansRequest < 3) {
-    checkUnnamed1105(o.spans);
+    checkUnnamed1108(o.spans);
   }
   buildCounterBatchWriteSpansRequest--;
 }
@@ -165,16 +164,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -203,14 +200,14 @@
   buildCounterLink--;
 }
 
-buildUnnamed1106() {
+buildUnnamed1109() {
   var o = new core.List<api.Link>();
   o.add(buildLink());
   o.add(buildLink());
   return o;
 }
 
-checkUnnamed1106(core.List<api.Link> o) {
+checkUnnamed1109(core.List<api.Link> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLink(o[0]);
   checkLink(o[1]);
@@ -222,7 +219,7 @@
   buildCounterLinks++;
   if (buildCounterLinks < 3) {
     o.droppedLinksCount = 42;
-    o.link = buildUnnamed1106();
+    o.link = buildUnnamed1109();
   }
   buildCounterLinks--;
   return o;
@@ -232,19 +229,19 @@
   buildCounterLinks++;
   if (buildCounterLinks < 3) {
     unittest.expect(o.droppedLinksCount, unittest.equals(42));
-    checkUnnamed1106(o.link);
+    checkUnnamed1109(o.link);
   }
   buildCounterLinks--;
 }
 
-buildUnnamed1107() {
+buildUnnamed1110() {
   var o = new core.List<api.Span>();
   o.add(buildSpan());
   o.add(buildSpan());
   return o;
 }
 
-checkUnnamed1107(core.List<api.Span> o) {
+checkUnnamed1110(core.List<api.Span> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpan(o[0]);
   checkSpan(o[1]);
@@ -256,7 +253,7 @@
   buildCounterListSpansResponse++;
   if (buildCounterListSpansResponse < 3) {
     o.nextPageToken = "foo";
-    o.spans = buildUnnamed1107();
+    o.spans = buildUnnamed1110();
   }
   buildCounterListSpansResponse--;
   return o;
@@ -266,19 +263,19 @@
   buildCounterListSpansResponse++;
   if (buildCounterListSpansResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1107(o.spans);
+    checkUnnamed1110(o.spans);
   }
   buildCounterListSpansResponse--;
 }
 
-buildUnnamed1108() {
+buildUnnamed1111() {
   var o = new core.List<api.Trace>();
   o.add(buildTrace());
   o.add(buildTrace());
   return o;
 }
 
-checkUnnamed1108(core.List<api.Trace> o) {
+checkUnnamed1111(core.List<api.Trace> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrace(o[0]);
   checkTrace(o[1]);
@@ -290,7 +287,7 @@
   buildCounterListTracesResponse++;
   if (buildCounterListTracesResponse < 3) {
     o.nextPageToken = "foo";
-    o.traces = buildUnnamed1108();
+    o.traces = buildUnnamed1111();
   }
   buildCounterListTracesResponse--;
   return o;
@@ -300,7 +297,7 @@
   buildCounterListTracesResponse++;
   if (buildCounterListTracesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1108(o.traces);
+    checkUnnamed1111(o.traces);
   }
   buildCounterListTracesResponse--;
 }
@@ -331,10 +328,11 @@
   var o = new api.NetworkEvent();
   buildCounterNetworkEvent++;
   if (buildCounterNetworkEvent < 3) {
+    o.compressedMessageSize = "foo";
     o.messageId = "foo";
-    o.messageSize = "foo";
     o.time = "foo";
     o.type = "foo";
+    o.uncompressedMessageSize = "foo";
   }
   buildCounterNetworkEvent--;
   return o;
@@ -343,10 +341,11 @@
 checkNetworkEvent(api.NetworkEvent o) {
   buildCounterNetworkEvent++;
   if (buildCounterNetworkEvent < 3) {
+    unittest.expect(o.compressedMessageSize, unittest.equals('foo'));
     unittest.expect(o.messageId, unittest.equals('foo'));
-    unittest.expect(o.messageSize, unittest.equals('foo'));
     unittest.expect(o.time, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.uncompressedMessageSize, unittest.equals('foo'));
   }
   buildCounterNetworkEvent--;
 }
@@ -425,14 +424,14 @@
   buildCounterStackFrame--;
 }
 
-buildUnnamed1109() {
+buildUnnamed1112() {
   var o = new core.List<api.StackFrame>();
   o.add(buildStackFrame());
   o.add(buildStackFrame());
   return o;
 }
 
-checkUnnamed1109(core.List<api.StackFrame> o) {
+checkUnnamed1112(core.List<api.StackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStackFrame(o[0]);
   checkStackFrame(o[1]);
@@ -444,7 +443,7 @@
   buildCounterStackFrames++;
   if (buildCounterStackFrames < 3) {
     o.droppedFramesCount = 42;
-    o.frame = buildUnnamed1109();
+    o.frame = buildUnnamed1112();
   }
   buildCounterStackFrames--;
   return o;
@@ -454,7 +453,7 @@
   buildCounterStackFrames++;
   if (buildCounterStackFrames < 3) {
     unittest.expect(o.droppedFramesCount, unittest.equals(42));
-    checkUnnamed1109(o.frame);
+    checkUnnamed1112(o.frame);
   }
   buildCounterStackFrames--;
 }
@@ -480,30 +479,46 @@
   buildCounterStackTrace--;
 }
 
-buildUnnamed1110() {
+buildUnnamed1113() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1110(core.Map<core.String, core.Object> o) {
+checkUnnamed1113(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1111() {
+buildUnnamed1114() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1110());
-  o.add(buildUnnamed1110());
+  o.add(buildUnnamed1113());
+  o.add(buildUnnamed1113());
   return o;
 }
 
-checkUnnamed1111(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1114(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1110(o[0]);
-  checkUnnamed1110(o[1]);
+  checkUnnamed1113(o[0]);
+  checkUnnamed1113(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -512,7 +527,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1111();
+    o.details = buildUnnamed1114();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -523,7 +538,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1111(o.details);
+    checkUnnamed1114(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -552,14 +567,14 @@
   buildCounterTimeEvent--;
 }
 
-buildUnnamed1112() {
+buildUnnamed1115() {
   var o = new core.List<api.TimeEvent>();
   o.add(buildTimeEvent());
   o.add(buildTimeEvent());
   return o;
 }
 
-checkUnnamed1112(core.List<api.TimeEvent> o) {
+checkUnnamed1115(core.List<api.TimeEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeEvent(o[0]);
   checkTimeEvent(o[1]);
@@ -572,7 +587,7 @@
   if (buildCounterTimeEvents < 3) {
     o.droppedAnnotationsCount = 42;
     o.droppedNetworkEventsCount = 42;
-    o.timeEvent = buildUnnamed1112();
+    o.timeEvent = buildUnnamed1115();
   }
   buildCounterTimeEvents--;
   return o;
@@ -583,7 +598,7 @@
   if (buildCounterTimeEvents < 3) {
     unittest.expect(o.droppedAnnotationsCount, unittest.equals(42));
     unittest.expect(o.droppedNetworkEventsCount, unittest.equals(42));
-    checkUnnamed1112(o.timeEvent);
+    checkUnnamed1115(o.timeEvent);
   }
   buildCounterTimeEvents--;
 }
@@ -628,7 +643,6 @@
   buildCounterTruncatableString--;
 }
 
-
 main() {
   unittest.group("obj-schema-Annotation", () {
     unittest.test("to-json--from-json", () {
@@ -638,7 +652,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AttributeValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildAttributeValue();
@@ -647,7 +660,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Attributes", () {
     unittest.test("to-json--from-json", () {
       var o = buildAttributes();
@@ -656,7 +668,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchWriteSpansRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchWriteSpansRequest();
@@ -665,7 +676,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -674,7 +684,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Link", () {
     unittest.test("to-json--from-json", () {
       var o = buildLink();
@@ -683,7 +692,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Links", () {
     unittest.test("to-json--from-json", () {
       var o = buildLinks();
@@ -692,7 +700,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListSpansResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListSpansResponse();
@@ -701,7 +708,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListTracesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListTracesResponse();
@@ -710,7 +716,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Module", () {
     unittest.test("to-json--from-json", () {
       var o = buildModule();
@@ -719,7 +724,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkEvent();
@@ -728,7 +732,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Span", () {
     unittest.test("to-json--from-json", () {
       var o = buildSpan();
@@ -737,7 +740,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StackFrame", () {
     unittest.test("to-json--from-json", () {
       var o = buildStackFrame();
@@ -746,7 +748,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StackFrames", () {
     unittest.test("to-json--from-json", () {
       var o = buildStackFrames();
@@ -755,7 +756,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StackTrace", () {
     unittest.test("to-json--from-json", () {
       var o = buildStackTrace();
@@ -764,7 +764,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -773,7 +772,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TimeEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimeEvent();
@@ -782,7 +780,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TimeEvents", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimeEvents();
@@ -791,7 +788,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Trace", () {
     unittest.test("to-json--from-json", () {
       var o = buildTrace();
@@ -800,7 +796,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TruncatableString", () {
     unittest.test("to-json--from-json", () {
       var o = buildTruncatableString();
@@ -809,12 +804,11 @@
     });
   });
 
-
   unittest.group("resource-ProjectsTracesResourceApi", () {
     unittest.test("method--batchWrite", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTracesResourceApi res = new api.CloudtraceApi(mock).projects.traces;
+      api.ProjectsTracesResourceApi res =
+          new api.CloudtraceApi(mock).projects.traces;
       var arg_request = buildBatchWriteSpansRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -825,9 +819,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -841,44 +837,49 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.batchWrite(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .batchWrite(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTracesResourceApi res = new api.CloudtraceApi(mock).projects.traces;
+      api.ProjectsTracesResourceApi res =
+          new api.CloudtraceApi(mock).projects.traces;
       var arg_parent = "foo";
+      var arg_orderBy = "foo";
       var arg_filter = "foo";
       var arg_endTime = "foo";
-      var arg_startTime = "foo";
       var arg_pageToken = "foo";
+      var arg_startTime = "foo";
       var arg_pageSize = 42;
-      var arg_orderBy = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -892,35 +893,49 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["endTime"].first, unittest.equals(arg_endTime));
-        unittest.expect(queryMap["startTime"].first, unittest.equals(arg_startTime));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-
+        unittest.expect(
+            queryMap["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["startTime"].first, unittest.equals(arg_startTime));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListTracesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, filter: arg_filter, endTime: arg_endTime, startTime: arg_startTime, pageToken: arg_pageToken, pageSize: arg_pageSize, orderBy: arg_orderBy).then(unittest.expectAsync1(((api.ListTracesResponse response) {
+      res
+          .list(arg_parent,
+              orderBy: arg_orderBy,
+              filter: arg_filter,
+              endTime: arg_endTime,
+              pageToken: arg_pageToken,
+              startTime: arg_startTime,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListTracesResponse response) {
         checkListTracesResponse(response);
       })));
     });
 
     unittest.test("method--listSpans", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTracesResourceApi res = new api.CloudtraceApi(mock).projects.traces;
+      api.ProjectsTracesResourceApi res =
+          new api.CloudtraceApi(mock).projects.traces;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -928,9 +943,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -944,34 +961,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSpansResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listSpans(arg_parent, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListSpansResponse response) {
+      res
+          .listSpans(arg_parent, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListSpansResponse response) {
         checkListSpansResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsTracesSpansResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTracesSpansResourceApi res = new api.CloudtraceApi(mock).projects.traces.spans;
+      api.ProjectsTracesSpansResourceApi res =
+          new api.CloudtraceApi(mock).projects.traces.spans;
       var arg_request = buildSpan();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -982,9 +1001,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -998,27 +1019,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSpan());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_name).then(unittest.expectAsync1(((api.Span response) {
+      res
+          .create(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Span response) {
         checkSpan(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index 920b31f..bb8378e 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.compute.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/compute/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -107,14 +106,14 @@
   buildCounterAcceleratorType--;
 }
 
-buildUnnamed2239() {
+buildUnnamed2226() {
   var o = new core.Map<core.String, api.AcceleratorTypesScopedList>();
   o["x"] = buildAcceleratorTypesScopedList();
   o["y"] = buildAcceleratorTypesScopedList();
   return o;
 }
 
-checkUnnamed2239(core.Map<core.String, api.AcceleratorTypesScopedList> o) {
+checkUnnamed2226(core.Map<core.String, api.AcceleratorTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorTypesScopedList(o["x"]);
   checkAcceleratorTypesScopedList(o["y"]);
@@ -126,7 +125,7 @@
   buildCounterAcceleratorTypeAggregatedList++;
   if (buildCounterAcceleratorTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2239();
+    o.items = buildUnnamed2226();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -139,7 +138,7 @@
   buildCounterAcceleratorTypeAggregatedList++;
   if (buildCounterAcceleratorTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2239(o.items);
+    checkUnnamed2226(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -147,14 +146,14 @@
   buildCounterAcceleratorTypeAggregatedList--;
 }
 
-buildUnnamed2240() {
+buildUnnamed2227() {
   var o = new core.List<api.AcceleratorType>();
   o.add(buildAcceleratorType());
   o.add(buildAcceleratorType());
   return o;
 }
 
-checkUnnamed2240(core.List<api.AcceleratorType> o) {
+checkUnnamed2227(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorType(o[0]);
   checkAcceleratorType(o[1]);
@@ -166,7 +165,7 @@
   buildCounterAcceleratorTypeList++;
   if (buildCounterAcceleratorTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2240();
+    o.items = buildUnnamed2227();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -179,7 +178,7 @@
   buildCounterAcceleratorTypeList++;
   if (buildCounterAcceleratorTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2240(o.items);
+    checkUnnamed2227(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -187,14 +186,14 @@
   buildCounterAcceleratorTypeList--;
 }
 
-buildUnnamed2241() {
+buildUnnamed2228() {
   var o = new core.List<api.AcceleratorType>();
   o.add(buildAcceleratorType());
   o.add(buildAcceleratorType());
   return o;
 }
 
-checkUnnamed2241(core.List<api.AcceleratorType> o) {
+checkUnnamed2228(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorType(o[0]);
   checkAcceleratorType(o[1]);
@@ -212,7 +211,8 @@
   return o;
 }
 
-checkAcceleratorTypesScopedListWarningData(api.AcceleratorTypesScopedListWarningData o) {
+checkAcceleratorTypesScopedListWarningData(
+    api.AcceleratorTypesScopedListWarningData o) {
   buildCounterAcceleratorTypesScopedListWarningData++;
   if (buildCounterAcceleratorTypesScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -221,14 +221,14 @@
   buildCounterAcceleratorTypesScopedListWarningData--;
 }
 
-buildUnnamed2242() {
+buildUnnamed2229() {
   var o = new core.List<api.AcceleratorTypesScopedListWarningData>();
   o.add(buildAcceleratorTypesScopedListWarningData());
   o.add(buildAcceleratorTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2242(core.List<api.AcceleratorTypesScopedListWarningData> o) {
+checkUnnamed2229(core.List<api.AcceleratorTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorTypesScopedListWarningData(o[0]);
   checkAcceleratorTypesScopedListWarningData(o[1]);
@@ -240,18 +240,19 @@
   buildCounterAcceleratorTypesScopedListWarning++;
   if (buildCounterAcceleratorTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2242();
+    o.data = buildUnnamed2229();
     o.message = "foo";
   }
   buildCounterAcceleratorTypesScopedListWarning--;
   return o;
 }
 
-checkAcceleratorTypesScopedListWarning(api.AcceleratorTypesScopedListWarning o) {
+checkAcceleratorTypesScopedListWarning(
+    api.AcceleratorTypesScopedListWarning o) {
   buildCounterAcceleratorTypesScopedListWarning++;
   if (buildCounterAcceleratorTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2242(o.data);
+    checkUnnamed2229(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAcceleratorTypesScopedListWarning--;
@@ -262,7 +263,7 @@
   var o = new api.AcceleratorTypesScopedList();
   buildCounterAcceleratorTypesScopedList++;
   if (buildCounterAcceleratorTypesScopedList < 3) {
-    o.acceleratorTypes = buildUnnamed2241();
+    o.acceleratorTypes = buildUnnamed2228();
     o.warning = buildAcceleratorTypesScopedListWarning();
   }
   buildCounterAcceleratorTypesScopedList--;
@@ -272,7 +273,7 @@
 checkAcceleratorTypesScopedList(api.AcceleratorTypesScopedList o) {
   buildCounterAcceleratorTypesScopedList++;
   if (buildCounterAcceleratorTypesScopedList < 3) {
-    checkUnnamed2241(o.acceleratorTypes);
+    checkUnnamed2228(o.acceleratorTypes);
     checkAcceleratorTypesScopedListWarning(o.warning);
   }
   buildCounterAcceleratorTypesScopedList--;
@@ -303,14 +304,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed2243() {
+buildUnnamed2230() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2243(core.List<core.String> o) {
+checkUnnamed2230(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -331,7 +332,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.users = buildUnnamed2243();
+    o.users = buildUnnamed2230();
   }
   buildCounterAddress--;
   return o;
@@ -350,19 +351,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2243(o.users);
+    checkUnnamed2230(o.users);
   }
   buildCounterAddress--;
 }
 
-buildUnnamed2244() {
+buildUnnamed2231() {
   var o = new core.Map<core.String, api.AddressesScopedList>();
   o["x"] = buildAddressesScopedList();
   o["y"] = buildAddressesScopedList();
   return o;
 }
 
-checkUnnamed2244(core.Map<core.String, api.AddressesScopedList> o) {
+checkUnnamed2231(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedList(o["x"]);
   checkAddressesScopedList(o["y"]);
@@ -374,7 +375,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2244();
+    o.items = buildUnnamed2231();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -387,7 +388,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2244(o.items);
+    checkUnnamed2231(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -395,14 +396,14 @@
   buildCounterAddressAggregatedList--;
 }
 
-buildUnnamed2245() {
+buildUnnamed2232() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed2245(core.List<api.Address> o) {
+checkUnnamed2232(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -414,7 +415,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2245();
+    o.items = buildUnnamed2232();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -427,7 +428,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2245(o.items);
+    checkUnnamed2232(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -435,14 +436,14 @@
   buildCounterAddressList--;
 }
 
-buildUnnamed2246() {
+buildUnnamed2233() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed2246(core.List<api.Address> o) {
+checkUnnamed2233(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -469,14 +470,14 @@
   buildCounterAddressesScopedListWarningData--;
 }
 
-buildUnnamed2247() {
+buildUnnamed2234() {
   var o = new core.List<api.AddressesScopedListWarningData>();
   o.add(buildAddressesScopedListWarningData());
   o.add(buildAddressesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2247(core.List<api.AddressesScopedListWarningData> o) {
+checkUnnamed2234(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedListWarningData(o[0]);
   checkAddressesScopedListWarningData(o[1]);
@@ -488,7 +489,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2247();
+    o.data = buildUnnamed2234();
     o.message = "foo";
   }
   buildCounterAddressesScopedListWarning--;
@@ -499,7 +500,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2247(o.data);
+    checkUnnamed2234(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressesScopedListWarning--;
@@ -510,7 +511,7 @@
   var o = new api.AddressesScopedList();
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    o.addresses = buildUnnamed2246();
+    o.addresses = buildUnnamed2233();
     o.warning = buildAddressesScopedListWarning();
   }
   buildCounterAddressesScopedList--;
@@ -520,7 +521,7 @@
 checkAddressesScopedList(api.AddressesScopedList o) {
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    checkUnnamed2246(o.addresses);
+    checkUnnamed2233(o.addresses);
     checkAddressesScopedListWarning(o.warning);
   }
   buildCounterAddressesScopedList--;
@@ -547,14 +548,14 @@
   buildCounterAliasIpRange--;
 }
 
-buildUnnamed2248() {
+buildUnnamed2235() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2248(core.List<core.String> o) {
+checkUnnamed2235(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -573,7 +574,7 @@
     o.initializeParams = buildAttachedDiskInitializeParams();
     o.interface = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed2248();
+    o.licenses = buildUnnamed2235();
     o.mode = "foo";
     o.source = "foo";
     o.type = "foo";
@@ -593,7 +594,7 @@
     checkAttachedDiskInitializeParams(o.initializeParams);
     unittest.expect(o.interface, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2248(o.licenses);
+    checkUnnamed2235(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -628,14 +629,14 @@
   buildCounterAttachedDiskInitializeParams--;
 }
 
-buildUnnamed2249() {
+buildUnnamed2236() {
   var o = new core.List<api.AutoscalerStatusDetails>();
   o.add(buildAutoscalerStatusDetails());
   o.add(buildAutoscalerStatusDetails());
   return o;
 }
 
-checkUnnamed2249(core.List<api.AutoscalerStatusDetails> o) {
+checkUnnamed2236(core.List<api.AutoscalerStatusDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalerStatusDetails(o[0]);
   checkAutoscalerStatusDetails(o[1]);
@@ -655,7 +656,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.statusDetails = buildUnnamed2249();
+    o.statusDetails = buildUnnamed2236();
     o.target = "foo";
     o.zone = "foo";
   }
@@ -675,21 +676,21 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2249(o.statusDetails);
+    checkUnnamed2236(o.statusDetails);
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterAutoscaler--;
 }
 
-buildUnnamed2250() {
+buildUnnamed2237() {
   var o = new core.Map<core.String, api.AutoscalersScopedList>();
   o["x"] = buildAutoscalersScopedList();
   o["y"] = buildAutoscalersScopedList();
   return o;
 }
 
-checkUnnamed2250(core.Map<core.String, api.AutoscalersScopedList> o) {
+checkUnnamed2237(core.Map<core.String, api.AutoscalersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalersScopedList(o["x"]);
   checkAutoscalersScopedList(o["y"]);
@@ -701,7 +702,7 @@
   buildCounterAutoscalerAggregatedList++;
   if (buildCounterAutoscalerAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2250();
+    o.items = buildUnnamed2237();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -714,7 +715,7 @@
   buildCounterAutoscalerAggregatedList++;
   if (buildCounterAutoscalerAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2250(o.items);
+    checkUnnamed2237(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -722,14 +723,14 @@
   buildCounterAutoscalerAggregatedList--;
 }
 
-buildUnnamed2251() {
+buildUnnamed2238() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed2251(core.List<api.Autoscaler> o) {
+checkUnnamed2238(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -741,7 +742,7 @@
   buildCounterAutoscalerList++;
   if (buildCounterAutoscalerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2251();
+    o.items = buildUnnamed2238();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -754,7 +755,7 @@
   buildCounterAutoscalerList++;
   if (buildCounterAutoscalerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2251(o.items);
+    checkUnnamed2238(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -783,14 +784,14 @@
   buildCounterAutoscalerStatusDetails--;
 }
 
-buildUnnamed2252() {
+buildUnnamed2239() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed2252(core.List<api.Autoscaler> o) {
+checkUnnamed2239(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -817,14 +818,14 @@
   buildCounterAutoscalersScopedListWarningData--;
 }
 
-buildUnnamed2253() {
+buildUnnamed2240() {
   var o = new core.List<api.AutoscalersScopedListWarningData>();
   o.add(buildAutoscalersScopedListWarningData());
   o.add(buildAutoscalersScopedListWarningData());
   return o;
 }
 
-checkUnnamed2253(core.List<api.AutoscalersScopedListWarningData> o) {
+checkUnnamed2240(core.List<api.AutoscalersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalersScopedListWarningData(o[0]);
   checkAutoscalersScopedListWarningData(o[1]);
@@ -836,7 +837,7 @@
   buildCounterAutoscalersScopedListWarning++;
   if (buildCounterAutoscalersScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2253();
+    o.data = buildUnnamed2240();
     o.message = "foo";
   }
   buildCounterAutoscalersScopedListWarning--;
@@ -847,7 +848,7 @@
   buildCounterAutoscalersScopedListWarning++;
   if (buildCounterAutoscalersScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2253(o.data);
+    checkUnnamed2240(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAutoscalersScopedListWarning--;
@@ -858,7 +859,7 @@
   var o = new api.AutoscalersScopedList();
   buildCounterAutoscalersScopedList++;
   if (buildCounterAutoscalersScopedList < 3) {
-    o.autoscalers = buildUnnamed2252();
+    o.autoscalers = buildUnnamed2239();
     o.warning = buildAutoscalersScopedListWarning();
   }
   buildCounterAutoscalersScopedList--;
@@ -868,20 +869,20 @@
 checkAutoscalersScopedList(api.AutoscalersScopedList o) {
   buildCounterAutoscalersScopedList++;
   if (buildCounterAutoscalersScopedList < 3) {
-    checkUnnamed2252(o.autoscalers);
+    checkUnnamed2239(o.autoscalers);
     checkAutoscalersScopedListWarning(o.warning);
   }
   buildCounterAutoscalersScopedList--;
 }
 
-buildUnnamed2254() {
+buildUnnamed2241() {
   var o = new core.List<api.AutoscalingPolicyCustomMetricUtilization>();
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   return o;
 }
 
-checkUnnamed2254(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
+checkUnnamed2241(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalingPolicyCustomMetricUtilization(o[0]);
   checkAutoscalingPolicyCustomMetricUtilization(o[1]);
@@ -894,8 +895,9 @@
   if (buildCounterAutoscalingPolicy < 3) {
     o.coolDownPeriodSec = 42;
     o.cpuUtilization = buildAutoscalingPolicyCpuUtilization();
-    o.customMetricUtilizations = buildUnnamed2254();
-    o.loadBalancingUtilization = buildAutoscalingPolicyLoadBalancingUtilization();
+    o.customMetricUtilizations = buildUnnamed2241();
+    o.loadBalancingUtilization =
+        buildAutoscalingPolicyLoadBalancingUtilization();
     o.maxNumReplicas = 42;
     o.minNumReplicas = 42;
   }
@@ -908,7 +910,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
     checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
-    checkUnnamed2254(o.customMetricUtilizations);
+    checkUnnamed2241(o.customMetricUtilizations);
     checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
@@ -948,7 +950,8 @@
   return o;
 }
 
-checkAutoscalingPolicyCustomMetricUtilization(api.AutoscalingPolicyCustomMetricUtilization o) {
+checkAutoscalingPolicyCustomMetricUtilization(
+    api.AutoscalingPolicyCustomMetricUtilization o) {
   buildCounterAutoscalingPolicyCustomMetricUtilization++;
   if (buildCounterAutoscalingPolicyCustomMetricUtilization < 3) {
     unittest.expect(o.metric, unittest.equals('foo'));
@@ -969,7 +972,8 @@
   return o;
 }
 
-checkAutoscalingPolicyLoadBalancingUtilization(api.AutoscalingPolicyLoadBalancingUtilization o) {
+checkAutoscalingPolicyLoadBalancingUtilization(
+    api.AutoscalingPolicyLoadBalancingUtilization o) {
   buildCounterAutoscalingPolicyLoadBalancingUtilization++;
   if (buildCounterAutoscalingPolicyLoadBalancingUtilization < 3) {
     unittest.expect(o.utilizationTarget, unittest.equals(42.0));
@@ -1045,14 +1049,14 @@
   buildCounterBackendBucket--;
 }
 
-buildUnnamed2255() {
+buildUnnamed2242() {
   var o = new core.List<api.BackendBucket>();
   o.add(buildBackendBucket());
   o.add(buildBackendBucket());
   return o;
 }
 
-checkUnnamed2255(core.List<api.BackendBucket> o) {
+checkUnnamed2242(core.List<api.BackendBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendBucket(o[0]);
   checkBackendBucket(o[1]);
@@ -1064,7 +1068,7 @@
   buildCounterBackendBucketList++;
   if (buildCounterBackendBucketList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2255();
+    o.items = buildUnnamed2242();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1077,7 +1081,7 @@
   buildCounterBackendBucketList++;
   if (buildCounterBackendBucketList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2255(o.items);
+    checkUnnamed2242(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1085,27 +1089,27 @@
   buildCounterBackendBucketList--;
 }
 
-buildUnnamed2256() {
+buildUnnamed2243() {
   var o = new core.List<api.Backend>();
   o.add(buildBackend());
   o.add(buildBackend());
   return o;
 }
 
-checkUnnamed2256(core.List<api.Backend> o) {
+checkUnnamed2243(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackend(o[0]);
   checkBackend(o[1]);
 }
 
-buildUnnamed2257() {
+buildUnnamed2244() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2257(core.List<core.String> o) {
+checkUnnamed2244(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1117,14 +1121,14 @@
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
     o.affinityCookieTtlSec = 42;
-    o.backends = buildUnnamed2256();
+    o.backends = buildUnnamed2243();
     o.cdnPolicy = buildBackendServiceCdnPolicy();
     o.connectionDraining = buildConnectionDraining();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.enableCDN = true;
     o.fingerprint = "foo";
-    o.healthChecks = buildUnnamed2257();
+    o.healthChecks = buildUnnamed2244();
     o.iap = buildBackendServiceIAP();
     o.id = "foo";
     o.kind = "foo";
@@ -1146,14 +1150,14 @@
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
     unittest.expect(o.affinityCookieTtlSec, unittest.equals(42));
-    checkUnnamed2256(o.backends);
+    checkUnnamed2243(o.backends);
     checkBackendServiceCdnPolicy(o.cdnPolicy);
     checkConnectionDraining(o.connectionDraining);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enableCDN, unittest.isTrue);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2257(o.healthChecks);
+    checkUnnamed2244(o.healthChecks);
     checkBackendServiceIAP(o.iap);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1170,14 +1174,14 @@
   buildCounterBackendService--;
 }
 
-buildUnnamed2258() {
+buildUnnamed2245() {
   var o = new core.Map<core.String, api.BackendServicesScopedList>();
   o["x"] = buildBackendServicesScopedList();
   o["y"] = buildBackendServicesScopedList();
   return o;
 }
 
-checkUnnamed2258(core.Map<core.String, api.BackendServicesScopedList> o) {
+checkUnnamed2245(core.Map<core.String, api.BackendServicesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendServicesScopedList(o["x"]);
   checkBackendServicesScopedList(o["y"]);
@@ -1189,7 +1193,7 @@
   buildCounterBackendServiceAggregatedList++;
   if (buildCounterBackendServiceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2258();
+    o.items = buildUnnamed2245();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1202,7 +1206,7 @@
   buildCounterBackendServiceAggregatedList++;
   if (buildCounterBackendServiceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2258(o.items);
+    checkUnnamed2245(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1229,14 +1233,14 @@
   buildCounterBackendServiceCdnPolicy--;
 }
 
-buildUnnamed2259() {
+buildUnnamed2246() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed2259(core.List<api.HealthStatus> o) {
+checkUnnamed2246(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -1247,7 +1251,7 @@
   var o = new api.BackendServiceGroupHealth();
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    o.healthStatus = buildUnnamed2259();
+    o.healthStatus = buildUnnamed2246();
     o.kind = "foo";
   }
   buildCounterBackendServiceGroupHealth--;
@@ -1257,7 +1261,7 @@
 checkBackendServiceGroupHealth(api.BackendServiceGroupHealth o) {
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    checkUnnamed2259(o.healthStatus);
+    checkUnnamed2246(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBackendServiceGroupHealth--;
@@ -1288,14 +1292,14 @@
   buildCounterBackendServiceIAP--;
 }
 
-buildUnnamed2260() {
+buildUnnamed2247() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed2260(core.List<api.BackendService> o) {
+checkUnnamed2247(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -1307,7 +1311,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2260();
+    o.items = buildUnnamed2247();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1320,7 +1324,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2260(o.items);
+    checkUnnamed2247(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1328,14 +1332,14 @@
   buildCounterBackendServiceList--;
 }
 
-buildUnnamed2261() {
+buildUnnamed2248() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed2261(core.List<api.BackendService> o) {
+checkUnnamed2248(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -1353,7 +1357,8 @@
   return o;
 }
 
-checkBackendServicesScopedListWarningData(api.BackendServicesScopedListWarningData o) {
+checkBackendServicesScopedListWarningData(
+    api.BackendServicesScopedListWarningData o) {
   buildCounterBackendServicesScopedListWarningData++;
   if (buildCounterBackendServicesScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -1362,14 +1367,14 @@
   buildCounterBackendServicesScopedListWarningData--;
 }
 
-buildUnnamed2262() {
+buildUnnamed2249() {
   var o = new core.List<api.BackendServicesScopedListWarningData>();
   o.add(buildBackendServicesScopedListWarningData());
   o.add(buildBackendServicesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2262(core.List<api.BackendServicesScopedListWarningData> o) {
+checkUnnamed2249(core.List<api.BackendServicesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendServicesScopedListWarningData(o[0]);
   checkBackendServicesScopedListWarningData(o[1]);
@@ -1381,7 +1386,7 @@
   buildCounterBackendServicesScopedListWarning++;
   if (buildCounterBackendServicesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2262();
+    o.data = buildUnnamed2249();
     o.message = "foo";
   }
   buildCounterBackendServicesScopedListWarning--;
@@ -1392,7 +1397,7 @@
   buildCounterBackendServicesScopedListWarning++;
   if (buildCounterBackendServicesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2262(o.data);
+    checkUnnamed2249(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterBackendServicesScopedListWarning--;
@@ -1403,7 +1408,7 @@
   var o = new api.BackendServicesScopedList();
   buildCounterBackendServicesScopedList++;
   if (buildCounterBackendServicesScopedList < 3) {
-    o.backendServices = buildUnnamed2261();
+    o.backendServices = buildUnnamed2248();
     o.warning = buildBackendServicesScopedListWarning();
   }
   buildCounterBackendServicesScopedList--;
@@ -1413,7 +1418,7 @@
 checkBackendServicesScopedList(api.BackendServicesScopedList o) {
   buildCounterBackendServicesScopedList++;
   if (buildCounterBackendServicesScopedList < 3) {
-    checkUnnamed2261(o.backendServices);
+    checkUnnamed2248(o.backendServices);
     checkBackendServicesScopedListWarning(o.warning);
   }
   buildCounterBackendServicesScopedList--;
@@ -1440,27 +1445,27 @@
   buildCounterCacheInvalidationRule--;
 }
 
-buildUnnamed2263() {
+buildUnnamed2250() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2263(core.List<core.String> o) {
+checkUnnamed2250(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2264() {
+buildUnnamed2251() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2264(core.List<core.String> o) {
+checkUnnamed2251(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1474,8 +1479,8 @@
     o.includeHost = true;
     o.includeProtocol = true;
     o.includeQueryString = true;
-    o.queryStringBlacklist = buildUnnamed2263();
-    o.queryStringWhitelist = buildUnnamed2264();
+    o.queryStringBlacklist = buildUnnamed2250();
+    o.queryStringWhitelist = buildUnnamed2251();
   }
   buildCounterCacheKeyPolicy--;
   return o;
@@ -1487,20 +1492,20 @@
     unittest.expect(o.includeHost, unittest.isTrue);
     unittest.expect(o.includeProtocol, unittest.isTrue);
     unittest.expect(o.includeQueryString, unittest.isTrue);
-    checkUnnamed2263(o.queryStringBlacklist);
-    checkUnnamed2264(o.queryStringWhitelist);
+    checkUnnamed2250(o.queryStringBlacklist);
+    checkUnnamed2251(o.queryStringWhitelist);
   }
   buildCounterCacheKeyPolicy--;
 }
 
-buildUnnamed2265() {
+buildUnnamed2252() {
   var o = new core.List<api.ResourceCommitment>();
   o.add(buildResourceCommitment());
   o.add(buildResourceCommitment());
   return o;
 }
 
-checkUnnamed2265(core.List<api.ResourceCommitment> o) {
+checkUnnamed2252(core.List<api.ResourceCommitment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceCommitment(o[0]);
   checkResourceCommitment(o[1]);
@@ -1519,7 +1524,7 @@
     o.name = "foo";
     o.plan = "foo";
     o.region = "foo";
-    o.resources = buildUnnamed2265();
+    o.resources = buildUnnamed2252();
     o.selfLink = "foo";
     o.startTimestamp = "foo";
     o.status = "foo";
@@ -1540,7 +1545,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.plan, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed2265(o.resources);
+    checkUnnamed2252(o.resources);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.startTimestamp, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -1549,14 +1554,14 @@
   buildCounterCommitment--;
 }
 
-buildUnnamed2266() {
+buildUnnamed2253() {
   var o = new core.Map<core.String, api.CommitmentsScopedList>();
   o["x"] = buildCommitmentsScopedList();
   o["y"] = buildCommitmentsScopedList();
   return o;
 }
 
-checkUnnamed2266(core.Map<core.String, api.CommitmentsScopedList> o) {
+checkUnnamed2253(core.Map<core.String, api.CommitmentsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitmentsScopedList(o["x"]);
   checkCommitmentsScopedList(o["y"]);
@@ -1568,7 +1573,7 @@
   buildCounterCommitmentAggregatedList++;
   if (buildCounterCommitmentAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2266();
+    o.items = buildUnnamed2253();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1581,7 +1586,7 @@
   buildCounterCommitmentAggregatedList++;
   if (buildCounterCommitmentAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2266(o.items);
+    checkUnnamed2253(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1589,14 +1594,14 @@
   buildCounterCommitmentAggregatedList--;
 }
 
-buildUnnamed2267() {
+buildUnnamed2254() {
   var o = new core.List<api.Commitment>();
   o.add(buildCommitment());
   o.add(buildCommitment());
   return o;
 }
 
-checkUnnamed2267(core.List<api.Commitment> o) {
+checkUnnamed2254(core.List<api.Commitment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitment(o[0]);
   checkCommitment(o[1]);
@@ -1608,7 +1613,7 @@
   buildCounterCommitmentList++;
   if (buildCounterCommitmentList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2267();
+    o.items = buildUnnamed2254();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1621,7 +1626,7 @@
   buildCounterCommitmentList++;
   if (buildCounterCommitmentList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2267(o.items);
+    checkUnnamed2254(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1629,14 +1634,14 @@
   buildCounterCommitmentList--;
 }
 
-buildUnnamed2268() {
+buildUnnamed2255() {
   var o = new core.List<api.Commitment>();
   o.add(buildCommitment());
   o.add(buildCommitment());
   return o;
 }
 
-checkUnnamed2268(core.List<api.Commitment> o) {
+checkUnnamed2255(core.List<api.Commitment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitment(o[0]);
   checkCommitment(o[1]);
@@ -1663,14 +1668,14 @@
   buildCounterCommitmentsScopedListWarningData--;
 }
 
-buildUnnamed2269() {
+buildUnnamed2256() {
   var o = new core.List<api.CommitmentsScopedListWarningData>();
   o.add(buildCommitmentsScopedListWarningData());
   o.add(buildCommitmentsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2269(core.List<api.CommitmentsScopedListWarningData> o) {
+checkUnnamed2256(core.List<api.CommitmentsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommitmentsScopedListWarningData(o[0]);
   checkCommitmentsScopedListWarningData(o[1]);
@@ -1682,7 +1687,7 @@
   buildCounterCommitmentsScopedListWarning++;
   if (buildCounterCommitmentsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2269();
+    o.data = buildUnnamed2256();
     o.message = "foo";
   }
   buildCounterCommitmentsScopedListWarning--;
@@ -1693,7 +1698,7 @@
   buildCounterCommitmentsScopedListWarning++;
   if (buildCounterCommitmentsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2269(o.data);
+    checkUnnamed2256(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterCommitmentsScopedListWarning--;
@@ -1704,7 +1709,7 @@
   var o = new api.CommitmentsScopedList();
   buildCounterCommitmentsScopedList++;
   if (buildCounterCommitmentsScopedList < 3) {
-    o.commitments = buildUnnamed2268();
+    o.commitments = buildUnnamed2255();
     o.warning = buildCommitmentsScopedListWarning();
   }
   buildCounterCommitmentsScopedList--;
@@ -1714,7 +1719,7 @@
 checkCommitmentsScopedList(api.CommitmentsScopedList o) {
   buildCounterCommitmentsScopedList++;
   if (buildCounterCommitmentsScopedList < 3) {
-    checkUnnamed2268(o.commitments);
+    checkUnnamed2255(o.commitments);
     checkCommitmentsScopedListWarning(o.warning);
   }
   buildCounterCommitmentsScopedList--;
@@ -1772,7 +1777,8 @@
   return o;
 }
 
-checkCustomerEncryptionKeyProtectedDisk(api.CustomerEncryptionKeyProtectedDisk o) {
+checkCustomerEncryptionKeyProtectedDisk(
+    api.CustomerEncryptionKeyProtectedDisk o) {
   buildCounterCustomerEncryptionKeyProtectedDisk++;
   if (buildCounterCustomerEncryptionKeyProtectedDisk < 3) {
     checkCustomerEncryptionKey(o.diskEncryptionKey);
@@ -1808,40 +1814,40 @@
   buildCounterDeprecationStatus--;
 }
 
-buildUnnamed2270() {
+buildUnnamed2257() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2270(core.Map<core.String, core.String> o) {
+checkUnnamed2257(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2271() {
+buildUnnamed2258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2271(core.List<core.String> o) {
+checkUnnamed2258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2272() {
+buildUnnamed2259() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2272(core.List<core.String> o) {
+checkUnnamed2259(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1858,10 +1864,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2270();
+    o.labels = buildUnnamed2257();
     o.lastAttachTimestamp = "foo";
     o.lastDetachTimestamp = "foo";
-    o.licenses = buildUnnamed2271();
+    o.licenses = buildUnnamed2258();
     o.name = "foo";
     o.options = "foo";
     o.selfLink = "foo";
@@ -1874,7 +1880,7 @@
     o.sourceSnapshotId = "foo";
     o.status = "foo";
     o.type = "foo";
-    o.users = buildUnnamed2272();
+    o.users = buildUnnamed2259();
     o.zone = "foo";
   }
   buildCounterDisk--;
@@ -1890,10 +1896,10 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2270(o.labels);
+    checkUnnamed2257(o.labels);
     unittest.expect(o.lastAttachTimestamp, unittest.equals('foo'));
     unittest.expect(o.lastDetachTimestamp, unittest.equals('foo'));
-    checkUnnamed2271(o.licenses);
+    checkUnnamed2258(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.options, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1906,20 +1912,20 @@
     unittest.expect(o.sourceSnapshotId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUnnamed2272(o.users);
+    checkUnnamed2259(o.users);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterDisk--;
 }
 
-buildUnnamed2273() {
+buildUnnamed2260() {
   var o = new core.Map<core.String, api.DisksScopedList>();
   o["x"] = buildDisksScopedList();
   o["y"] = buildDisksScopedList();
   return o;
 }
 
-checkUnnamed2273(core.Map<core.String, api.DisksScopedList> o) {
+checkUnnamed2260(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedList(o["x"]);
   checkDisksScopedList(o["y"]);
@@ -1931,7 +1937,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2273();
+    o.items = buildUnnamed2260();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1944,7 +1950,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2273(o.items);
+    checkUnnamed2260(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1952,14 +1958,14 @@
   buildCounterDiskAggregatedList--;
 }
 
-buildUnnamed2274() {
+buildUnnamed2261() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed2274(core.List<api.Disk> o) {
+checkUnnamed2261(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -1971,7 +1977,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2274();
+    o.items = buildUnnamed2261();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1984,7 +1990,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2274(o.items);
+    checkUnnamed2261(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2050,14 +2056,14 @@
   buildCounterDiskType--;
 }
 
-buildUnnamed2275() {
+buildUnnamed2262() {
   var o = new core.Map<core.String, api.DiskTypesScopedList>();
   o["x"] = buildDiskTypesScopedList();
   o["y"] = buildDiskTypesScopedList();
   return o;
 }
 
-checkUnnamed2275(core.Map<core.String, api.DiskTypesScopedList> o) {
+checkUnnamed2262(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedList(o["x"]);
   checkDiskTypesScopedList(o["y"]);
@@ -2069,7 +2075,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2275();
+    o.items = buildUnnamed2262();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2082,7 +2088,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2275(o.items);
+    checkUnnamed2262(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2090,14 +2096,14 @@
   buildCounterDiskTypeAggregatedList--;
 }
 
-buildUnnamed2276() {
+buildUnnamed2263() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed2276(core.List<api.DiskType> o) {
+checkUnnamed2263(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -2109,7 +2115,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2276();
+    o.items = buildUnnamed2263();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2122,7 +2128,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2276(o.items);
+    checkUnnamed2263(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2130,14 +2136,14 @@
   buildCounterDiskTypeList--;
 }
 
-buildUnnamed2277() {
+buildUnnamed2264() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed2277(core.List<api.DiskType> o) {
+checkUnnamed2264(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -2164,14 +2170,14 @@
   buildCounterDiskTypesScopedListWarningData--;
 }
 
-buildUnnamed2278() {
+buildUnnamed2265() {
   var o = new core.List<api.DiskTypesScopedListWarningData>();
   o.add(buildDiskTypesScopedListWarningData());
   o.add(buildDiskTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2278(core.List<api.DiskTypesScopedListWarningData> o) {
+checkUnnamed2265(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedListWarningData(o[0]);
   checkDiskTypesScopedListWarningData(o[1]);
@@ -2183,7 +2189,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2278();
+    o.data = buildUnnamed2265();
     o.message = "foo";
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -2194,7 +2200,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2278(o.data);
+    checkUnnamed2265(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -2205,7 +2211,7 @@
   var o = new api.DiskTypesScopedList();
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    o.diskTypes = buildUnnamed2277();
+    o.diskTypes = buildUnnamed2264();
     o.warning = buildDiskTypesScopedListWarning();
   }
   buildCounterDiskTypesScopedList--;
@@ -2215,7 +2221,7 @@
 checkDiskTypesScopedList(api.DiskTypesScopedList o) {
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    checkUnnamed2277(o.diskTypes);
+    checkUnnamed2264(o.diskTypes);
     checkDiskTypesScopedListWarning(o.warning);
   }
   buildCounterDiskTypesScopedList--;
@@ -2240,14 +2246,14 @@
   buildCounterDisksResizeRequest--;
 }
 
-buildUnnamed2279() {
+buildUnnamed2266() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed2279(core.List<api.Disk> o) {
+checkUnnamed2266(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -2274,14 +2280,14 @@
   buildCounterDisksScopedListWarningData--;
 }
 
-buildUnnamed2280() {
+buildUnnamed2267() {
   var o = new core.List<api.DisksScopedListWarningData>();
   o.add(buildDisksScopedListWarningData());
   o.add(buildDisksScopedListWarningData());
   return o;
 }
 
-checkUnnamed2280(core.List<api.DisksScopedListWarningData> o) {
+checkUnnamed2267(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedListWarningData(o[0]);
   checkDisksScopedListWarningData(o[1]);
@@ -2293,7 +2299,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2280();
+    o.data = buildUnnamed2267();
     o.message = "foo";
   }
   buildCounterDisksScopedListWarning--;
@@ -2304,7 +2310,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2280(o.data);
+    checkUnnamed2267(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDisksScopedListWarning--;
@@ -2315,7 +2321,7 @@
   var o = new api.DisksScopedList();
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    o.disks = buildUnnamed2279();
+    o.disks = buildUnnamed2266();
     o.warning = buildDisksScopedListWarning();
   }
   buildCounterDisksScopedList--;
@@ -2325,20 +2331,20 @@
 checkDisksScopedList(api.DisksScopedList o) {
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    checkUnnamed2279(o.disks);
+    checkUnnamed2266(o.disks);
     checkDisksScopedListWarning(o.warning);
   }
   buildCounterDisksScopedList--;
 }
 
-buildUnnamed2281() {
+buildUnnamed2268() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2281(core.List<core.String> o) {
+checkUnnamed2268(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2350,7 +2356,7 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed2281();
+    o.ports = buildUnnamed2268();
   }
   buildCounterFirewallAllowed--;
   return o;
@@ -2360,32 +2366,32 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed2281(o.ports);
+    checkUnnamed2268(o.ports);
   }
   buildCounterFirewallAllowed--;
 }
 
-buildUnnamed2282() {
+buildUnnamed2269() {
   var o = new core.List<api.FirewallAllowed>();
   o.add(buildFirewallAllowed());
   o.add(buildFirewallAllowed());
   return o;
 }
 
-checkUnnamed2282(core.List<api.FirewallAllowed> o) {
+checkUnnamed2269(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallAllowed(o[0]);
   checkFirewallAllowed(o[1]);
 }
 
-buildUnnamed2283() {
+buildUnnamed2270() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2283(core.List<core.String> o) {
+checkUnnamed2270(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2397,7 +2403,7 @@
   buildCounterFirewallDenied++;
   if (buildCounterFirewallDenied < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed2283();
+    o.ports = buildUnnamed2270();
   }
   buildCounterFirewallDenied--;
   return o;
@@ -2407,71 +2413,71 @@
   buildCounterFirewallDenied++;
   if (buildCounterFirewallDenied < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed2283(o.ports);
+    checkUnnamed2270(o.ports);
   }
   buildCounterFirewallDenied--;
 }
 
-buildUnnamed2284() {
+buildUnnamed2271() {
   var o = new core.List<api.FirewallDenied>();
   o.add(buildFirewallDenied());
   o.add(buildFirewallDenied());
   return o;
 }
 
-checkUnnamed2284(core.List<api.FirewallDenied> o) {
+checkUnnamed2271(core.List<api.FirewallDenied> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallDenied(o[0]);
   checkFirewallDenied(o[1]);
 }
 
-buildUnnamed2285() {
+buildUnnamed2272() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2285(core.List<core.String> o) {
+checkUnnamed2272(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2286() {
+buildUnnamed2273() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2286(core.List<core.String> o) {
+checkUnnamed2273(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2287() {
+buildUnnamed2274() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2287(core.List<core.String> o) {
+checkUnnamed2274(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2288() {
+buildUnnamed2275() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2288(core.List<core.String> o) {
+checkUnnamed2275(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2482,11 +2488,11 @@
   var o = new api.Firewall();
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    o.allowed = buildUnnamed2282();
+    o.allowed = buildUnnamed2269();
     o.creationTimestamp = "foo";
-    o.denied = buildUnnamed2284();
+    o.denied = buildUnnamed2271();
     o.description = "foo";
-    o.destinationRanges = buildUnnamed2285();
+    o.destinationRanges = buildUnnamed2272();
     o.direction = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -2494,9 +2500,9 @@
     o.network = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.sourceRanges = buildUnnamed2286();
-    o.sourceTags = buildUnnamed2287();
-    o.targetTags = buildUnnamed2288();
+    o.sourceRanges = buildUnnamed2273();
+    o.sourceTags = buildUnnamed2274();
+    o.targetTags = buildUnnamed2275();
   }
   buildCounterFirewall--;
   return o;
@@ -2505,11 +2511,11 @@
 checkFirewall(api.Firewall o) {
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    checkUnnamed2282(o.allowed);
+    checkUnnamed2269(o.allowed);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkUnnamed2284(o.denied);
+    checkUnnamed2271(o.denied);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2285(o.destinationRanges);
+    checkUnnamed2272(o.destinationRanges);
     unittest.expect(o.direction, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -2517,21 +2523,21 @@
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2286(o.sourceRanges);
-    checkUnnamed2287(o.sourceTags);
-    checkUnnamed2288(o.targetTags);
+    checkUnnamed2273(o.sourceRanges);
+    checkUnnamed2274(o.sourceTags);
+    checkUnnamed2275(o.targetTags);
   }
   buildCounterFirewall--;
 }
 
-buildUnnamed2289() {
+buildUnnamed2276() {
   var o = new core.List<api.Firewall>();
   o.add(buildFirewall());
   o.add(buildFirewall());
   return o;
 }
 
-checkUnnamed2289(core.List<api.Firewall> o) {
+checkUnnamed2276(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewall(o[0]);
   checkFirewall(o[1]);
@@ -2543,7 +2549,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2289();
+    o.items = buildUnnamed2276();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2556,7 +2562,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2289(o.items);
+    checkUnnamed2276(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2564,14 +2570,14 @@
   buildCounterFirewallList--;
 }
 
-buildUnnamed2290() {
+buildUnnamed2277() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2290(core.List<core.String> o) {
+checkUnnamed2277(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2594,7 +2600,7 @@
     o.name = "foo";
     o.network = "foo";
     o.portRange = "foo";
-    o.ports = buildUnnamed2290();
+    o.ports = buildUnnamed2277();
     o.region = "foo";
     o.selfLink = "foo";
     o.subnetwork = "foo";
@@ -2619,7 +2625,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.portRange, unittest.equals('foo'));
-    checkUnnamed2290(o.ports);
+    checkUnnamed2277(o.ports);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.subnetwork, unittest.equals('foo'));
@@ -2628,14 +2634,14 @@
   buildCounterForwardingRule--;
 }
 
-buildUnnamed2291() {
+buildUnnamed2278() {
   var o = new core.Map<core.String, api.ForwardingRulesScopedList>();
   o["x"] = buildForwardingRulesScopedList();
   o["y"] = buildForwardingRulesScopedList();
   return o;
 }
 
-checkUnnamed2291(core.Map<core.String, api.ForwardingRulesScopedList> o) {
+checkUnnamed2278(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedList(o["x"]);
   checkForwardingRulesScopedList(o["y"]);
@@ -2647,7 +2653,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2291();
+    o.items = buildUnnamed2278();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2660,7 +2666,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2291(o.items);
+    checkUnnamed2278(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2668,14 +2674,14 @@
   buildCounterForwardingRuleAggregatedList--;
 }
 
-buildUnnamed2292() {
+buildUnnamed2279() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed2292(core.List<api.ForwardingRule> o) {
+checkUnnamed2279(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -2687,7 +2693,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2292();
+    o.items = buildUnnamed2279();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2700,7 +2706,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2292(o.items);
+    checkUnnamed2279(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2708,14 +2714,14 @@
   buildCounterForwardingRuleList--;
 }
 
-buildUnnamed2293() {
+buildUnnamed2280() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed2293(core.List<api.ForwardingRule> o) {
+checkUnnamed2280(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -2733,7 +2739,8 @@
   return o;
 }
 
-checkForwardingRulesScopedListWarningData(api.ForwardingRulesScopedListWarningData o) {
+checkForwardingRulesScopedListWarningData(
+    api.ForwardingRulesScopedListWarningData o) {
   buildCounterForwardingRulesScopedListWarningData++;
   if (buildCounterForwardingRulesScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -2742,14 +2749,14 @@
   buildCounterForwardingRulesScopedListWarningData--;
 }
 
-buildUnnamed2294() {
+buildUnnamed2281() {
   var o = new core.List<api.ForwardingRulesScopedListWarningData>();
   o.add(buildForwardingRulesScopedListWarningData());
   o.add(buildForwardingRulesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2294(core.List<api.ForwardingRulesScopedListWarningData> o) {
+checkUnnamed2281(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedListWarningData(o[0]);
   checkForwardingRulesScopedListWarningData(o[1]);
@@ -2761,7 +2768,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2294();
+    o.data = buildUnnamed2281();
     o.message = "foo";
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -2772,7 +2779,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2294(o.data);
+    checkUnnamed2281(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -2783,7 +2790,7 @@
   var o = new api.ForwardingRulesScopedList();
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    o.forwardingRules = buildUnnamed2293();
+    o.forwardingRules = buildUnnamed2280();
     o.warning = buildForwardingRulesScopedListWarning();
   }
   buildCounterForwardingRulesScopedList--;
@@ -2793,20 +2800,20 @@
 checkForwardingRulesScopedList(api.ForwardingRulesScopedList o) {
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    checkUnnamed2293(o.forwardingRules);
+    checkUnnamed2280(o.forwardingRules);
     checkForwardingRulesScopedListWarning(o.warning);
   }
   buildCounterForwardingRulesScopedList--;
 }
 
-buildUnnamed2295() {
+buildUnnamed2282() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2295(core.Map<core.String, core.String> o) {
+checkUnnamed2282(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2818,7 +2825,7 @@
   buildCounterGlobalSetLabelsRequest++;
   if (buildCounterGlobalSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2295();
+    o.labels = buildUnnamed2282();
   }
   buildCounterGlobalSetLabelsRequest--;
   return o;
@@ -2828,7 +2835,7 @@
   buildCounterGlobalSetLabelsRequest++;
   if (buildCounterGlobalSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2295(o.labels);
+    checkUnnamed2282(o.labels);
   }
   buildCounterGlobalSetLabelsRequest--;
 }
@@ -2953,14 +2960,14 @@
   buildCounterHealthCheck--;
 }
 
-buildUnnamed2296() {
+buildUnnamed2283() {
   var o = new core.List<api.HealthCheck>();
   o.add(buildHealthCheck());
   o.add(buildHealthCheck());
   return o;
 }
 
-checkUnnamed2296(core.List<api.HealthCheck> o) {
+checkUnnamed2283(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheck(o[0]);
   checkHealthCheck(o[1]);
@@ -2972,7 +2979,7 @@
   buildCounterHealthCheckList++;
   if (buildCounterHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2296();
+    o.items = buildUnnamed2283();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2985,7 +2992,7 @@
   buildCounterHealthCheckList++;
   if (buildCounterHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2296(o.items);
+    checkUnnamed2283(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3037,14 +3044,14 @@
   buildCounterHealthStatus--;
 }
 
-buildUnnamed2297() {
+buildUnnamed2284() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2297(core.List<core.String> o) {
+checkUnnamed2284(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3056,7 +3063,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     o.description = "foo";
-    o.hosts = buildUnnamed2297();
+    o.hosts = buildUnnamed2284();
     o.pathMatcher = "foo";
   }
   buildCounterHostRule--;
@@ -3067,7 +3074,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2297(o.hosts);
+    checkUnnamed2284(o.hosts);
     unittest.expect(o.pathMatcher, unittest.equals('foo'));
   }
   buildCounterHostRule--;
@@ -3116,14 +3123,14 @@
   buildCounterHttpHealthCheck--;
 }
 
-buildUnnamed2298() {
+buildUnnamed2285() {
   var o = new core.List<api.HttpHealthCheck>();
   o.add(buildHttpHealthCheck());
   o.add(buildHttpHealthCheck());
   return o;
 }
 
-checkUnnamed2298(core.List<api.HttpHealthCheck> o) {
+checkUnnamed2285(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheck(o[0]);
   checkHttpHealthCheck(o[1]);
@@ -3135,7 +3142,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2298();
+    o.items = buildUnnamed2285();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3148,7 +3155,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2298(o.items);
+    checkUnnamed2285(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3199,14 +3206,14 @@
   buildCounterHttpsHealthCheck--;
 }
 
-buildUnnamed2299() {
+buildUnnamed2286() {
   var o = new core.List<api.HttpsHealthCheck>();
   o.add(buildHttpsHealthCheck());
   o.add(buildHttpsHealthCheck());
   return o;
 }
 
-checkUnnamed2299(core.List<api.HttpsHealthCheck> o) {
+checkUnnamed2286(core.List<api.HttpsHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpsHealthCheck(o[0]);
   checkHttpsHealthCheck(o[1]);
@@ -3218,7 +3225,7 @@
   buildCounterHttpsHealthCheckList++;
   if (buildCounterHttpsHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2299();
+    o.items = buildUnnamed2286();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3231,7 +3238,7 @@
   buildCounterHttpsHealthCheckList++;
   if (buildCounterHttpsHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2299(o.items);
+    checkUnnamed2286(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3239,40 +3246,40 @@
   buildCounterHttpsHealthCheckList--;
 }
 
-buildUnnamed2300() {
+buildUnnamed2287() {
   var o = new core.List<api.GuestOsFeature>();
   o.add(buildGuestOsFeature());
   o.add(buildGuestOsFeature());
   return o;
 }
 
-checkUnnamed2300(core.List<api.GuestOsFeature> o) {
+checkUnnamed2287(core.List<api.GuestOsFeature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuestOsFeature(o[0]);
   checkGuestOsFeature(o[1]);
 }
 
-buildUnnamed2301() {
+buildUnnamed2288() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2301(core.Map<core.String, core.String> o) {
+checkUnnamed2288(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2302() {
+buildUnnamed2289() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2302(core.List<core.String> o) {
+checkUnnamed2289(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3312,13 +3319,13 @@
     o.description = "foo";
     o.diskSizeGb = "foo";
     o.family = "foo";
-    o.guestOsFeatures = buildUnnamed2300();
+    o.guestOsFeatures = buildUnnamed2287();
     o.id = "foo";
     o.imageEncryptionKey = buildCustomerEncryptionKey();
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2301();
-    o.licenses = buildUnnamed2302();
+    o.labels = buildUnnamed2288();
+    o.licenses = buildUnnamed2289();
     o.name = "foo";
     o.rawDisk = buildImageRawDisk();
     o.selfLink = "foo";
@@ -3341,13 +3348,13 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed2300(o.guestOsFeatures);
+    checkUnnamed2287(o.guestOsFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     checkCustomerEncryptionKey(o.imageEncryptionKey);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2301(o.labels);
-    checkUnnamed2302(o.licenses);
+    checkUnnamed2288(o.labels);
+    checkUnnamed2289(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     checkImageRawDisk(o.rawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3360,14 +3367,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed2303() {
+buildUnnamed2290() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed2303(core.List<api.Image> o) {
+checkUnnamed2290(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -3379,7 +3386,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2303();
+    o.items = buildUnnamed2290();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3392,7 +3399,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2303(o.items);
+    checkUnnamed2290(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3400,66 +3407,66 @@
   buildCounterImageList--;
 }
 
-buildUnnamed2304() {
+buildUnnamed2291() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed2304(core.List<api.AttachedDisk> o) {
+checkUnnamed2291(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed2305() {
+buildUnnamed2292() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed2305(core.List<api.AcceleratorConfig> o) {
+checkUnnamed2292(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed2306() {
+buildUnnamed2293() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2306(core.Map<core.String, core.String> o) {
+checkUnnamed2293(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2307() {
+buildUnnamed2294() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed2307(core.List<api.NetworkInterface> o) {
+checkUnnamed2294(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed2308() {
+buildUnnamed2295() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed2308(core.List<api.ServiceAccount> o) {
+checkUnnamed2295(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -3474,19 +3481,19 @@
     o.cpuPlatform = "foo";
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.disks = buildUnnamed2304();
-    o.guestAccelerators = buildUnnamed2305();
+    o.disks = buildUnnamed2291();
+    o.guestAccelerators = buildUnnamed2292();
     o.id = "foo";
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2306();
+    o.labels = buildUnnamed2293();
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.name = "foo";
-    o.networkInterfaces = buildUnnamed2307();
+    o.networkInterfaces = buildUnnamed2294();
     o.scheduling = buildScheduling();
     o.selfLink = "foo";
-    o.serviceAccounts = buildUnnamed2308();
+    o.serviceAccounts = buildUnnamed2295();
     o.startRestricted = true;
     o.status = "foo";
     o.statusMessage = "foo";
@@ -3504,19 +3511,19 @@
     unittest.expect(o.cpuPlatform, unittest.equals('foo'));
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2304(o.disks);
-    checkUnnamed2305(o.guestAccelerators);
+    checkUnnamed2291(o.disks);
+    checkUnnamed2292(o.guestAccelerators);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2306(o.labels);
+    checkUnnamed2293(o.labels);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2307(o.networkInterfaces);
+    checkUnnamed2294(o.networkInterfaces);
     checkScheduling(o.scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2308(o.serviceAccounts);
+    checkUnnamed2295(o.serviceAccounts);
     unittest.expect(o.startRestricted, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
@@ -3526,14 +3533,14 @@
   buildCounterInstance--;
 }
 
-buildUnnamed2309() {
+buildUnnamed2296() {
   var o = new core.Map<core.String, api.InstancesScopedList>();
   o["x"] = buildInstancesScopedList();
   o["y"] = buildInstancesScopedList();
   return o;
 }
 
-checkUnnamed2309(core.Map<core.String, api.InstancesScopedList> o) {
+checkUnnamed2296(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedList(o["x"]);
   checkInstancesScopedList(o["y"]);
@@ -3545,7 +3552,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2309();
+    o.items = buildUnnamed2296();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3558,7 +3565,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2309(o.items);
+    checkUnnamed2296(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3566,14 +3573,14 @@
   buildCounterInstanceAggregatedList--;
 }
 
-buildUnnamed2310() {
+buildUnnamed2297() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2310(core.List<api.NamedPort> o) {
+checkUnnamed2297(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -3590,7 +3597,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.namedPorts = buildUnnamed2310();
+    o.namedPorts = buildUnnamed2297();
     o.network = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -3611,7 +3618,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2310(o.namedPorts);
+    checkUnnamed2297(o.namedPorts);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3622,14 +3629,14 @@
   buildCounterInstanceGroup--;
 }
 
-buildUnnamed2311() {
+buildUnnamed2298() {
   var o = new core.Map<core.String, api.InstanceGroupsScopedList>();
   o["x"] = buildInstanceGroupsScopedList();
   o["y"] = buildInstanceGroupsScopedList();
   return o;
 }
 
-checkUnnamed2311(core.Map<core.String, api.InstanceGroupsScopedList> o) {
+checkUnnamed2298(core.Map<core.String, api.InstanceGroupsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupsScopedList(o["x"]);
   checkInstanceGroupsScopedList(o["y"]);
@@ -3641,7 +3648,7 @@
   buildCounterInstanceGroupAggregatedList++;
   if (buildCounterInstanceGroupAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2311();
+    o.items = buildUnnamed2298();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3654,7 +3661,7 @@
   buildCounterInstanceGroupAggregatedList++;
   if (buildCounterInstanceGroupAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2311(o.items);
+    checkUnnamed2298(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3662,14 +3669,14 @@
   buildCounterInstanceGroupAggregatedList--;
 }
 
-buildUnnamed2312() {
+buildUnnamed2299() {
   var o = new core.List<api.InstanceGroup>();
   o.add(buildInstanceGroup());
   o.add(buildInstanceGroup());
   return o;
 }
 
-checkUnnamed2312(core.List<api.InstanceGroup> o) {
+checkUnnamed2299(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroup(o[0]);
   checkInstanceGroup(o[1]);
@@ -3681,7 +3688,7 @@
   buildCounterInstanceGroupList++;
   if (buildCounterInstanceGroupList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2312();
+    o.items = buildUnnamed2299();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3694,7 +3701,7 @@
   buildCounterInstanceGroupList++;
   if (buildCounterInstanceGroupList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2312(o.items);
+    checkUnnamed2299(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3702,27 +3709,27 @@
   buildCounterInstanceGroupList--;
 }
 
-buildUnnamed2313() {
+buildUnnamed2300() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2313(core.List<api.NamedPort> o) {
+checkUnnamed2300(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
 }
 
-buildUnnamed2314() {
+buildUnnamed2301() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2314(core.List<core.String> o) {
+checkUnnamed2301(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3743,10 +3750,10 @@
     o.instanceTemplate = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.namedPorts = buildUnnamed2313();
+    o.namedPorts = buildUnnamed2300();
     o.region = "foo";
     o.selfLink = "foo";
-    o.targetPools = buildUnnamed2314();
+    o.targetPools = buildUnnamed2301();
     o.targetSize = 42;
     o.zone = "foo";
   }
@@ -3767,10 +3774,10 @@
     unittest.expect(o.instanceTemplate, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2313(o.namedPorts);
+    checkUnnamed2300(o.namedPorts);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2314(o.targetPools);
+    checkUnnamed2301(o.targetPools);
     unittest.expect(o.targetSize, unittest.equals(42));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
@@ -3795,7 +3802,8 @@
   return o;
 }
 
-checkInstanceGroupManagerActionsSummary(api.InstanceGroupManagerActionsSummary o) {
+checkInstanceGroupManagerActionsSummary(
+    api.InstanceGroupManagerActionsSummary o) {
   buildCounterInstanceGroupManagerActionsSummary++;
   if (buildCounterInstanceGroupManagerActionsSummary < 3) {
     unittest.expect(o.abandoning, unittest.equals(42));
@@ -3810,14 +3818,14 @@
   buildCounterInstanceGroupManagerActionsSummary--;
 }
 
-buildUnnamed2315() {
+buildUnnamed2302() {
   var o = new core.Map<core.String, api.InstanceGroupManagersScopedList>();
   o["x"] = buildInstanceGroupManagersScopedList();
   o["y"] = buildInstanceGroupManagersScopedList();
   return o;
 }
 
-checkUnnamed2315(core.Map<core.String, api.InstanceGroupManagersScopedList> o) {
+checkUnnamed2302(core.Map<core.String, api.InstanceGroupManagersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManagersScopedList(o["x"]);
   checkInstanceGroupManagersScopedList(o["y"]);
@@ -3829,7 +3837,7 @@
   buildCounterInstanceGroupManagerAggregatedList++;
   if (buildCounterInstanceGroupManagerAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2315();
+    o.items = buildUnnamed2302();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3838,11 +3846,12 @@
   return o;
 }
 
-checkInstanceGroupManagerAggregatedList(api.InstanceGroupManagerAggregatedList o) {
+checkInstanceGroupManagerAggregatedList(
+    api.InstanceGroupManagerAggregatedList o) {
   buildCounterInstanceGroupManagerAggregatedList++;
   if (buildCounterInstanceGroupManagerAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2315(o.items);
+    checkUnnamed2302(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3850,14 +3859,14 @@
   buildCounterInstanceGroupManagerAggregatedList--;
 }
 
-buildUnnamed2316() {
+buildUnnamed2303() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed2316(core.List<api.InstanceGroupManager> o) {
+checkUnnamed2303(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -3869,7 +3878,7 @@
   buildCounterInstanceGroupManagerList++;
   if (buildCounterInstanceGroupManagerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2316();
+    o.items = buildUnnamed2303();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3882,7 +3891,7 @@
   buildCounterInstanceGroupManagerList++;
   if (buildCounterInstanceGroupManagerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2316(o.items);
+    checkUnnamed2303(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3890,14 +3899,14 @@
   buildCounterInstanceGroupManagerList--;
 }
 
-buildUnnamed2317() {
+buildUnnamed2304() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2317(core.List<core.String> o) {
+checkUnnamed2304(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3908,28 +3917,29 @@
   var o = new api.InstanceGroupManagersAbandonInstancesRequest();
   buildCounterInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
-    o.instances = buildUnnamed2317();
+    o.instances = buildUnnamed2304();
   }
   buildCounterInstanceGroupManagersAbandonInstancesRequest--;
   return o;
 }
 
-checkInstanceGroupManagersAbandonInstancesRequest(api.InstanceGroupManagersAbandonInstancesRequest o) {
+checkInstanceGroupManagersAbandonInstancesRequest(
+    api.InstanceGroupManagersAbandonInstancesRequest o) {
   buildCounterInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
-    checkUnnamed2317(o.instances);
+    checkUnnamed2304(o.instances);
   }
   buildCounterInstanceGroupManagersAbandonInstancesRequest--;
 }
 
-buildUnnamed2318() {
+buildUnnamed2305() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2318(core.List<core.String> o) {
+checkUnnamed2305(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3940,28 +3950,29 @@
   var o = new api.InstanceGroupManagersDeleteInstancesRequest();
   buildCounterInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
-    o.instances = buildUnnamed2318();
+    o.instances = buildUnnamed2305();
   }
   buildCounterInstanceGroupManagersDeleteInstancesRequest--;
   return o;
 }
 
-checkInstanceGroupManagersDeleteInstancesRequest(api.InstanceGroupManagersDeleteInstancesRequest o) {
+checkInstanceGroupManagersDeleteInstancesRequest(
+    api.InstanceGroupManagersDeleteInstancesRequest o) {
   buildCounterInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
-    checkUnnamed2318(o.instances);
+    checkUnnamed2305(o.instances);
   }
   buildCounterInstanceGroupManagersDeleteInstancesRequest--;
 }
 
-buildUnnamed2319() {
+buildUnnamed2306() {
   var o = new core.List<api.ManagedInstance>();
   o.add(buildManagedInstance());
   o.add(buildManagedInstance());
   return o;
 }
 
-checkUnnamed2319(core.List<api.ManagedInstance> o) {
+checkUnnamed2306(core.List<api.ManagedInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedInstance(o[0]);
   checkManagedInstance(o[1]);
@@ -3972,28 +3983,29 @@
   var o = new api.InstanceGroupManagersListManagedInstancesResponse();
   buildCounterInstanceGroupManagersListManagedInstancesResponse++;
   if (buildCounterInstanceGroupManagersListManagedInstancesResponse < 3) {
-    o.managedInstances = buildUnnamed2319();
+    o.managedInstances = buildUnnamed2306();
   }
   buildCounterInstanceGroupManagersListManagedInstancesResponse--;
   return o;
 }
 
-checkInstanceGroupManagersListManagedInstancesResponse(api.InstanceGroupManagersListManagedInstancesResponse o) {
+checkInstanceGroupManagersListManagedInstancesResponse(
+    api.InstanceGroupManagersListManagedInstancesResponse o) {
   buildCounterInstanceGroupManagersListManagedInstancesResponse++;
   if (buildCounterInstanceGroupManagersListManagedInstancesResponse < 3) {
-    checkUnnamed2319(o.managedInstances);
+    checkUnnamed2306(o.managedInstances);
   }
   buildCounterInstanceGroupManagersListManagedInstancesResponse--;
 }
 
-buildUnnamed2320() {
+buildUnnamed2307() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2320(core.List<core.String> o) {
+checkUnnamed2307(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4004,28 +4016,29 @@
   var o = new api.InstanceGroupManagersRecreateInstancesRequest();
   buildCounterInstanceGroupManagersRecreateInstancesRequest++;
   if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
-    o.instances = buildUnnamed2320();
+    o.instances = buildUnnamed2307();
   }
   buildCounterInstanceGroupManagersRecreateInstancesRequest--;
   return o;
 }
 
-checkInstanceGroupManagersRecreateInstancesRequest(api.InstanceGroupManagersRecreateInstancesRequest o) {
+checkInstanceGroupManagersRecreateInstancesRequest(
+    api.InstanceGroupManagersRecreateInstancesRequest o) {
   buildCounterInstanceGroupManagersRecreateInstancesRequest++;
   if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
-    checkUnnamed2320(o.instances);
+    checkUnnamed2307(o.instances);
   }
   buildCounterInstanceGroupManagersRecreateInstancesRequest--;
 }
 
-buildUnnamed2321() {
+buildUnnamed2308() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed2321(core.List<api.InstanceGroupManager> o) {
+checkUnnamed2308(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -4043,7 +4056,8 @@
   return o;
 }
 
-checkInstanceGroupManagersScopedListWarningData(api.InstanceGroupManagersScopedListWarningData o) {
+checkInstanceGroupManagersScopedListWarningData(
+    api.InstanceGroupManagersScopedListWarningData o) {
   buildCounterInstanceGroupManagersScopedListWarningData++;
   if (buildCounterInstanceGroupManagersScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -4052,14 +4066,14 @@
   buildCounterInstanceGroupManagersScopedListWarningData--;
 }
 
-buildUnnamed2322() {
+buildUnnamed2309() {
   var o = new core.List<api.InstanceGroupManagersScopedListWarningData>();
   o.add(buildInstanceGroupManagersScopedListWarningData());
   o.add(buildInstanceGroupManagersScopedListWarningData());
   return o;
 }
 
-checkUnnamed2322(core.List<api.InstanceGroupManagersScopedListWarningData> o) {
+checkUnnamed2309(core.List<api.InstanceGroupManagersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManagersScopedListWarningData(o[0]);
   checkInstanceGroupManagersScopedListWarningData(o[1]);
@@ -4071,18 +4085,19 @@
   buildCounterInstanceGroupManagersScopedListWarning++;
   if (buildCounterInstanceGroupManagersScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2322();
+    o.data = buildUnnamed2309();
     o.message = "foo";
   }
   buildCounterInstanceGroupManagersScopedListWarning--;
   return o;
 }
 
-checkInstanceGroupManagersScopedListWarning(api.InstanceGroupManagersScopedListWarning o) {
+checkInstanceGroupManagersScopedListWarning(
+    api.InstanceGroupManagersScopedListWarning o) {
   buildCounterInstanceGroupManagersScopedListWarning++;
   if (buildCounterInstanceGroupManagersScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2322(o.data);
+    checkUnnamed2309(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupManagersScopedListWarning--;
@@ -4093,7 +4108,7 @@
   var o = new api.InstanceGroupManagersScopedList();
   buildCounterInstanceGroupManagersScopedList++;
   if (buildCounterInstanceGroupManagersScopedList < 3) {
-    o.instanceGroupManagers = buildUnnamed2321();
+    o.instanceGroupManagers = buildUnnamed2308();
     o.warning = buildInstanceGroupManagersScopedListWarning();
   }
   buildCounterInstanceGroupManagersScopedList--;
@@ -4103,7 +4118,7 @@
 checkInstanceGroupManagersScopedList(api.InstanceGroupManagersScopedList o) {
   buildCounterInstanceGroupManagersScopedList++;
   if (buildCounterInstanceGroupManagersScopedList < 3) {
-    checkUnnamed2321(o.instanceGroupManagers);
+    checkUnnamed2308(o.instanceGroupManagers);
     checkInstanceGroupManagersScopedListWarning(o.warning);
   }
   buildCounterInstanceGroupManagersScopedList--;
@@ -4120,7 +4135,8 @@
   return o;
 }
 
-checkInstanceGroupManagersSetInstanceTemplateRequest(api.InstanceGroupManagersSetInstanceTemplateRequest o) {
+checkInstanceGroupManagersSetInstanceTemplateRequest(
+    api.InstanceGroupManagersSetInstanceTemplateRequest o) {
   buildCounterInstanceGroupManagersSetInstanceTemplateRequest++;
   if (buildCounterInstanceGroupManagersSetInstanceTemplateRequest < 3) {
     unittest.expect(o.instanceTemplate, unittest.equals('foo'));
@@ -4128,14 +4144,14 @@
   buildCounterInstanceGroupManagersSetInstanceTemplateRequest--;
 }
 
-buildUnnamed2323() {
+buildUnnamed2310() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2323(core.List<core.String> o) {
+checkUnnamed2310(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4147,29 +4163,30 @@
   buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
     o.fingerprint = "foo";
-    o.targetPools = buildUnnamed2323();
+    o.targetPools = buildUnnamed2310();
   }
   buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
   return o;
 }
 
-checkInstanceGroupManagersSetTargetPoolsRequest(api.InstanceGroupManagersSetTargetPoolsRequest o) {
+checkInstanceGroupManagersSetTargetPoolsRequest(
+    api.InstanceGroupManagersSetTargetPoolsRequest o) {
   buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2323(o.targetPools);
+    checkUnnamed2310(o.targetPools);
   }
   buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
 }
 
-buildUnnamed2324() {
+buildUnnamed2311() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2324(core.List<api.InstanceReference> o) {
+checkUnnamed2311(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4180,28 +4197,29 @@
   var o = new api.InstanceGroupsAddInstancesRequest();
   buildCounterInstanceGroupsAddInstancesRequest++;
   if (buildCounterInstanceGroupsAddInstancesRequest < 3) {
-    o.instances = buildUnnamed2324();
+    o.instances = buildUnnamed2311();
   }
   buildCounterInstanceGroupsAddInstancesRequest--;
   return o;
 }
 
-checkInstanceGroupsAddInstancesRequest(api.InstanceGroupsAddInstancesRequest o) {
+checkInstanceGroupsAddInstancesRequest(
+    api.InstanceGroupsAddInstancesRequest o) {
   buildCounterInstanceGroupsAddInstancesRequest++;
   if (buildCounterInstanceGroupsAddInstancesRequest < 3) {
-    checkUnnamed2324(o.instances);
+    checkUnnamed2311(o.instances);
   }
   buildCounterInstanceGroupsAddInstancesRequest--;
 }
 
-buildUnnamed2325() {
+buildUnnamed2312() {
   var o = new core.List<api.InstanceWithNamedPorts>();
   o.add(buildInstanceWithNamedPorts());
   o.add(buildInstanceWithNamedPorts());
   return o;
 }
 
-checkUnnamed2325(core.List<api.InstanceWithNamedPorts> o) {
+checkUnnamed2312(core.List<api.InstanceWithNamedPorts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceWithNamedPorts(o[0]);
   checkInstanceWithNamedPorts(o[1]);
@@ -4213,7 +4231,7 @@
   buildCounterInstanceGroupsListInstances++;
   if (buildCounterInstanceGroupsListInstances < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2325();
+    o.items = buildUnnamed2312();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4226,7 +4244,7 @@
   buildCounterInstanceGroupsListInstances++;
   if (buildCounterInstanceGroupsListInstances < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2325(o.items);
+    checkUnnamed2312(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4245,7 +4263,8 @@
   return o;
 }
 
-checkInstanceGroupsListInstancesRequest(api.InstanceGroupsListInstancesRequest o) {
+checkInstanceGroupsListInstancesRequest(
+    api.InstanceGroupsListInstancesRequest o) {
   buildCounterInstanceGroupsListInstancesRequest++;
   if (buildCounterInstanceGroupsListInstancesRequest < 3) {
     unittest.expect(o.instanceState, unittest.equals('foo'));
@@ -4253,14 +4272,14 @@
   buildCounterInstanceGroupsListInstancesRequest--;
 }
 
-buildUnnamed2326() {
+buildUnnamed2313() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2326(core.List<api.InstanceReference> o) {
+checkUnnamed2313(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4271,28 +4290,29 @@
   var o = new api.InstanceGroupsRemoveInstancesRequest();
   buildCounterInstanceGroupsRemoveInstancesRequest++;
   if (buildCounterInstanceGroupsRemoveInstancesRequest < 3) {
-    o.instances = buildUnnamed2326();
+    o.instances = buildUnnamed2313();
   }
   buildCounterInstanceGroupsRemoveInstancesRequest--;
   return o;
 }
 
-checkInstanceGroupsRemoveInstancesRequest(api.InstanceGroupsRemoveInstancesRequest o) {
+checkInstanceGroupsRemoveInstancesRequest(
+    api.InstanceGroupsRemoveInstancesRequest o) {
   buildCounterInstanceGroupsRemoveInstancesRequest++;
   if (buildCounterInstanceGroupsRemoveInstancesRequest < 3) {
-    checkUnnamed2326(o.instances);
+    checkUnnamed2313(o.instances);
   }
   buildCounterInstanceGroupsRemoveInstancesRequest--;
 }
 
-buildUnnamed2327() {
+buildUnnamed2314() {
   var o = new core.List<api.InstanceGroup>();
   o.add(buildInstanceGroup());
   o.add(buildInstanceGroup());
   return o;
 }
 
-checkUnnamed2327(core.List<api.InstanceGroup> o) {
+checkUnnamed2314(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroup(o[0]);
   checkInstanceGroup(o[1]);
@@ -4310,7 +4330,8 @@
   return o;
 }
 
-checkInstanceGroupsScopedListWarningData(api.InstanceGroupsScopedListWarningData o) {
+checkInstanceGroupsScopedListWarningData(
+    api.InstanceGroupsScopedListWarningData o) {
   buildCounterInstanceGroupsScopedListWarningData++;
   if (buildCounterInstanceGroupsScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -4319,14 +4340,14 @@
   buildCounterInstanceGroupsScopedListWarningData--;
 }
 
-buildUnnamed2328() {
+buildUnnamed2315() {
   var o = new core.List<api.InstanceGroupsScopedListWarningData>();
   o.add(buildInstanceGroupsScopedListWarningData());
   o.add(buildInstanceGroupsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2328(core.List<api.InstanceGroupsScopedListWarningData> o) {
+checkUnnamed2315(core.List<api.InstanceGroupsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupsScopedListWarningData(o[0]);
   checkInstanceGroupsScopedListWarningData(o[1]);
@@ -4338,7 +4359,7 @@
   buildCounterInstanceGroupsScopedListWarning++;
   if (buildCounterInstanceGroupsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2328();
+    o.data = buildUnnamed2315();
     o.message = "foo";
   }
   buildCounterInstanceGroupsScopedListWarning--;
@@ -4349,7 +4370,7 @@
   buildCounterInstanceGroupsScopedListWarning++;
   if (buildCounterInstanceGroupsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2328(o.data);
+    checkUnnamed2315(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstanceGroupsScopedListWarning--;
@@ -4360,7 +4381,7 @@
   var o = new api.InstanceGroupsScopedList();
   buildCounterInstanceGroupsScopedList++;
   if (buildCounterInstanceGroupsScopedList < 3) {
-    o.instanceGroups = buildUnnamed2327();
+    o.instanceGroups = buildUnnamed2314();
     o.warning = buildInstanceGroupsScopedListWarning();
   }
   buildCounterInstanceGroupsScopedList--;
@@ -4370,20 +4391,20 @@
 checkInstanceGroupsScopedList(api.InstanceGroupsScopedList o) {
   buildCounterInstanceGroupsScopedList++;
   if (buildCounterInstanceGroupsScopedList < 3) {
-    checkUnnamed2327(o.instanceGroups);
+    checkUnnamed2314(o.instanceGroups);
     checkInstanceGroupsScopedListWarning(o.warning);
   }
   buildCounterInstanceGroupsScopedList--;
 }
 
-buildUnnamed2329() {
+buildUnnamed2316() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2329(core.List<api.NamedPort> o) {
+checkUnnamed2316(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -4395,29 +4416,30 @@
   buildCounterInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterInstanceGroupsSetNamedPortsRequest < 3) {
     o.fingerprint = "foo";
-    o.namedPorts = buildUnnamed2329();
+    o.namedPorts = buildUnnamed2316();
   }
   buildCounterInstanceGroupsSetNamedPortsRequest--;
   return o;
 }
 
-checkInstanceGroupsSetNamedPortsRequest(api.InstanceGroupsSetNamedPortsRequest o) {
+checkInstanceGroupsSetNamedPortsRequest(
+    api.InstanceGroupsSetNamedPortsRequest o) {
   buildCounterInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterInstanceGroupsSetNamedPortsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2329(o.namedPorts);
+    checkUnnamed2316(o.namedPorts);
   }
   buildCounterInstanceGroupsSetNamedPortsRequest--;
 }
 
-buildUnnamed2330() {
+buildUnnamed2317() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2330(core.List<api.Instance> o) {
+checkUnnamed2317(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -4429,7 +4451,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2330();
+    o.items = buildUnnamed2317();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4442,7 +4464,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2330(o.items);
+    checkUnnamed2317(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4471,66 +4493,66 @@
   buildCounterInstanceMoveRequest--;
 }
 
-buildUnnamed2331() {
+buildUnnamed2318() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed2331(core.List<api.AttachedDisk> o) {
+checkUnnamed2318(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed2332() {
+buildUnnamed2319() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed2332(core.List<api.AcceleratorConfig> o) {
+checkUnnamed2319(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed2333() {
+buildUnnamed2320() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2333(core.Map<core.String, core.String> o) {
+checkUnnamed2320(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2334() {
+buildUnnamed2321() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed2334(core.List<api.NetworkInterface> o) {
+checkUnnamed2321(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed2335() {
+buildUnnamed2322() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed2335(core.List<api.ServiceAccount> o) {
+checkUnnamed2322(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -4543,14 +4565,14 @@
   if (buildCounterInstanceProperties < 3) {
     o.canIpForward = true;
     o.description = "foo";
-    o.disks = buildUnnamed2331();
-    o.guestAccelerators = buildUnnamed2332();
-    o.labels = buildUnnamed2333();
+    o.disks = buildUnnamed2318();
+    o.guestAccelerators = buildUnnamed2319();
+    o.labels = buildUnnamed2320();
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed2334();
+    o.networkInterfaces = buildUnnamed2321();
     o.scheduling = buildScheduling();
-    o.serviceAccounts = buildUnnamed2335();
+    o.serviceAccounts = buildUnnamed2322();
     o.tags = buildTags();
   }
   buildCounterInstanceProperties--;
@@ -4562,14 +4584,14 @@
   if (buildCounterInstanceProperties < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2331(o.disks);
-    checkUnnamed2332(o.guestAccelerators);
-    checkUnnamed2333(o.labels);
+    checkUnnamed2318(o.disks);
+    checkUnnamed2319(o.guestAccelerators);
+    checkUnnamed2320(o.labels);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed2334(o.networkInterfaces);
+    checkUnnamed2321(o.networkInterfaces);
     checkScheduling(o.scheduling);
-    checkUnnamed2335(o.serviceAccounts);
+    checkUnnamed2322(o.serviceAccounts);
     checkTags(o.tags);
   }
   buildCounterInstanceProperties--;
@@ -4625,14 +4647,14 @@
   buildCounterInstanceTemplate--;
 }
 
-buildUnnamed2336() {
+buildUnnamed2323() {
   var o = new core.List<api.InstanceTemplate>();
   o.add(buildInstanceTemplate());
   o.add(buildInstanceTemplate());
   return o;
 }
 
-checkUnnamed2336(core.List<api.InstanceTemplate> o) {
+checkUnnamed2323(core.List<api.InstanceTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceTemplate(o[0]);
   checkInstanceTemplate(o[1]);
@@ -4644,7 +4666,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2336();
+    o.items = buildUnnamed2323();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4657,7 +4679,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2336(o.items);
+    checkUnnamed2323(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4665,14 +4687,14 @@
   buildCounterInstanceTemplateList--;
 }
 
-buildUnnamed2337() {
+buildUnnamed2324() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2337(core.List<api.NamedPort> o) {
+checkUnnamed2324(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -4684,7 +4706,7 @@
   buildCounterInstanceWithNamedPorts++;
   if (buildCounterInstanceWithNamedPorts < 3) {
     o.instance = "foo";
-    o.namedPorts = buildUnnamed2337();
+    o.namedPorts = buildUnnamed2324();
     o.status = "foo";
   }
   buildCounterInstanceWithNamedPorts--;
@@ -4695,20 +4717,20 @@
   buildCounterInstanceWithNamedPorts++;
   if (buildCounterInstanceWithNamedPorts < 3) {
     unittest.expect(o.instance, unittest.equals('foo'));
-    checkUnnamed2337(o.namedPorts);
+    checkUnnamed2324(o.namedPorts);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterInstanceWithNamedPorts--;
 }
 
-buildUnnamed2338() {
+buildUnnamed2325() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2338(core.List<api.Instance> o) {
+checkUnnamed2325(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -4735,14 +4757,14 @@
   buildCounterInstancesScopedListWarningData--;
 }
 
-buildUnnamed2339() {
+buildUnnamed2326() {
   var o = new core.List<api.InstancesScopedListWarningData>();
   o.add(buildInstancesScopedListWarningData());
   o.add(buildInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2339(core.List<api.InstancesScopedListWarningData> o) {
+checkUnnamed2326(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedListWarningData(o[0]);
   checkInstancesScopedListWarningData(o[1]);
@@ -4754,7 +4776,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2339();
+    o.data = buildUnnamed2326();
     o.message = "foo";
   }
   buildCounterInstancesScopedListWarning--;
@@ -4765,7 +4787,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2339(o.data);
+    checkUnnamed2326(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstancesScopedListWarning--;
@@ -4776,7 +4798,7 @@
   var o = new api.InstancesScopedList();
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    o.instances = buildUnnamed2338();
+    o.instances = buildUnnamed2325();
     o.warning = buildInstancesScopedListWarning();
   }
   buildCounterInstancesScopedList--;
@@ -4786,20 +4808,20 @@
 checkInstancesScopedList(api.InstancesScopedList o) {
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    checkUnnamed2338(o.instances);
+    checkUnnamed2325(o.instances);
     checkInstancesScopedListWarning(o.warning);
   }
   buildCounterInstancesScopedList--;
 }
 
-buildUnnamed2340() {
+buildUnnamed2327() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2340(core.Map<core.String, core.String> o) {
+checkUnnamed2327(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -4811,7 +4833,7 @@
   buildCounterInstancesSetLabelsRequest++;
   if (buildCounterInstancesSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2340();
+    o.labels = buildUnnamed2327();
   }
   buildCounterInstancesSetLabelsRequest--;
   return o;
@@ -4821,19 +4843,19 @@
   buildCounterInstancesSetLabelsRequest++;
   if (buildCounterInstancesSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2340(o.labels);
+    checkUnnamed2327(o.labels);
   }
   buildCounterInstancesSetLabelsRequest--;
 }
 
-buildUnnamed2341() {
+buildUnnamed2328() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed2341(core.List<api.AcceleratorConfig> o) {
+checkUnnamed2328(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
@@ -4844,16 +4866,17 @@
   var o = new api.InstancesSetMachineResourcesRequest();
   buildCounterInstancesSetMachineResourcesRequest++;
   if (buildCounterInstancesSetMachineResourcesRequest < 3) {
-    o.guestAccelerators = buildUnnamed2341();
+    o.guestAccelerators = buildUnnamed2328();
   }
   buildCounterInstancesSetMachineResourcesRequest--;
   return o;
 }
 
-checkInstancesSetMachineResourcesRequest(api.InstancesSetMachineResourcesRequest o) {
+checkInstancesSetMachineResourcesRequest(
+    api.InstancesSetMachineResourcesRequest o) {
   buildCounterInstancesSetMachineResourcesRequest++;
   if (buildCounterInstancesSetMachineResourcesRequest < 3) {
-    checkUnnamed2341(o.guestAccelerators);
+    checkUnnamed2328(o.guestAccelerators);
   }
   buildCounterInstancesSetMachineResourcesRequest--;
 }
@@ -4877,14 +4900,14 @@
   buildCounterInstancesSetMachineTypeRequest--;
 }
 
-buildUnnamed2342() {
+buildUnnamed2329() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2342(core.List<core.String> o) {
+checkUnnamed2329(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -4896,29 +4919,30 @@
   buildCounterInstancesSetServiceAccountRequest++;
   if (buildCounterInstancesSetServiceAccountRequest < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed2342();
+    o.scopes = buildUnnamed2329();
   }
   buildCounterInstancesSetServiceAccountRequest--;
   return o;
 }
 
-checkInstancesSetServiceAccountRequest(api.InstancesSetServiceAccountRequest o) {
+checkInstancesSetServiceAccountRequest(
+    api.InstancesSetServiceAccountRequest o) {
   buildCounterInstancesSetServiceAccountRequest++;
   if (buildCounterInstancesSetServiceAccountRequest < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed2342(o.scopes);
+    checkUnnamed2329(o.scopes);
   }
   buildCounterInstancesSetServiceAccountRequest--;
 }
 
-buildUnnamed2343() {
+buildUnnamed2330() {
   var o = new core.List<api.CustomerEncryptionKeyProtectedDisk>();
   o.add(buildCustomerEncryptionKeyProtectedDisk());
   o.add(buildCustomerEncryptionKeyProtectedDisk());
   return o;
 }
 
-checkUnnamed2343(core.List<api.CustomerEncryptionKeyProtectedDisk> o) {
+checkUnnamed2330(core.List<api.CustomerEncryptionKeyProtectedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomerEncryptionKeyProtectedDisk(o[0]);
   checkCustomerEncryptionKeyProtectedDisk(o[1]);
@@ -4929,16 +4953,17 @@
   var o = new api.InstancesStartWithEncryptionKeyRequest();
   buildCounterInstancesStartWithEncryptionKeyRequest++;
   if (buildCounterInstancesStartWithEncryptionKeyRequest < 3) {
-    o.disks = buildUnnamed2343();
+    o.disks = buildUnnamed2330();
   }
   buildCounterInstancesStartWithEncryptionKeyRequest--;
   return o;
 }
 
-checkInstancesStartWithEncryptionKeyRequest(api.InstancesStartWithEncryptionKeyRequest o) {
+checkInstancesStartWithEncryptionKeyRequest(
+    api.InstancesStartWithEncryptionKeyRequest o) {
   buildCounterInstancesStartWithEncryptionKeyRequest++;
   if (buildCounterInstancesStartWithEncryptionKeyRequest < 3) {
-    checkUnnamed2343(o.disks);
+    checkUnnamed2330(o.disks);
   }
   buildCounterInstancesStartWithEncryptionKeyRequest--;
 }
@@ -4987,14 +5012,14 @@
   buildCounterMachineTypeScratchDisks--;
 }
 
-buildUnnamed2344() {
+buildUnnamed2331() {
   var o = new core.List<api.MachineTypeScratchDisks>();
   o.add(buildMachineTypeScratchDisks());
   o.add(buildMachineTypeScratchDisks());
   return o;
 }
 
-checkUnnamed2344(core.List<api.MachineTypeScratchDisks> o) {
+checkUnnamed2331(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeScratchDisks(o[0]);
   checkMachineTypeScratchDisks(o[1]);
@@ -5017,7 +5042,7 @@
     o.maximumPersistentDisksSizeGb = "foo";
     o.memoryMb = 42;
     o.name = "foo";
-    o.scratchDisks = buildUnnamed2344();
+    o.scratchDisks = buildUnnamed2331();
     o.selfLink = "foo";
     o.zone = "foo";
   }
@@ -5040,21 +5065,21 @@
     unittest.expect(o.maximumPersistentDisksSizeGb, unittest.equals('foo'));
     unittest.expect(o.memoryMb, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2344(o.scratchDisks);
+    checkUnnamed2331(o.scratchDisks);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterMachineType--;
 }
 
-buildUnnamed2345() {
+buildUnnamed2332() {
   var o = new core.Map<core.String, api.MachineTypesScopedList>();
   o["x"] = buildMachineTypesScopedList();
   o["y"] = buildMachineTypesScopedList();
   return o;
 }
 
-checkUnnamed2345(core.Map<core.String, api.MachineTypesScopedList> o) {
+checkUnnamed2332(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedList(o["x"]);
   checkMachineTypesScopedList(o["y"]);
@@ -5066,7 +5091,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2345();
+    o.items = buildUnnamed2332();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5079,7 +5104,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2345(o.items);
+    checkUnnamed2332(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5087,14 +5112,14 @@
   buildCounterMachineTypeAggregatedList--;
 }
 
-buildUnnamed2346() {
+buildUnnamed2333() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed2346(core.List<api.MachineType> o) {
+checkUnnamed2333(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -5106,7 +5131,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2346();
+    o.items = buildUnnamed2333();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5119,7 +5144,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2346(o.items);
+    checkUnnamed2333(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5127,14 +5152,14 @@
   buildCounterMachineTypeList--;
 }
 
-buildUnnamed2347() {
+buildUnnamed2334() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed2347(core.List<api.MachineType> o) {
+checkUnnamed2334(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -5152,7 +5177,8 @@
   return o;
 }
 
-checkMachineTypesScopedListWarningData(api.MachineTypesScopedListWarningData o) {
+checkMachineTypesScopedListWarningData(
+    api.MachineTypesScopedListWarningData o) {
   buildCounterMachineTypesScopedListWarningData++;
   if (buildCounterMachineTypesScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -5161,14 +5187,14 @@
   buildCounterMachineTypesScopedListWarningData--;
 }
 
-buildUnnamed2348() {
+buildUnnamed2335() {
   var o = new core.List<api.MachineTypesScopedListWarningData>();
   o.add(buildMachineTypesScopedListWarningData());
   o.add(buildMachineTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2348(core.List<api.MachineTypesScopedListWarningData> o) {
+checkUnnamed2335(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedListWarningData(o[0]);
   checkMachineTypesScopedListWarningData(o[1]);
@@ -5180,7 +5206,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2348();
+    o.data = buildUnnamed2335();
     o.message = "foo";
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -5191,7 +5217,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2348(o.data);
+    checkUnnamed2335(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -5202,7 +5228,7 @@
   var o = new api.MachineTypesScopedList();
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    o.machineTypes = buildUnnamed2347();
+    o.machineTypes = buildUnnamed2334();
     o.warning = buildMachineTypesScopedListWarning();
   }
   buildCounterMachineTypesScopedList--;
@@ -5212,7 +5238,7 @@
 checkMachineTypesScopedList(api.MachineTypesScopedList o) {
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    checkUnnamed2347(o.machineTypes);
+    checkUnnamed2334(o.machineTypes);
     checkMachineTypesScopedListWarning(o.warning);
   }
   buildCounterMachineTypesScopedList--;
@@ -5258,7 +5284,8 @@
   return o;
 }
 
-checkManagedInstanceLastAttemptErrorsErrors(api.ManagedInstanceLastAttemptErrorsErrors o) {
+checkManagedInstanceLastAttemptErrorsErrors(
+    api.ManagedInstanceLastAttemptErrorsErrors o) {
   buildCounterManagedInstanceLastAttemptErrorsErrors++;
   if (buildCounterManagedInstanceLastAttemptErrorsErrors < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
@@ -5268,14 +5295,14 @@
   buildCounterManagedInstanceLastAttemptErrorsErrors--;
 }
 
-buildUnnamed2349() {
+buildUnnamed2336() {
   var o = new core.List<api.ManagedInstanceLastAttemptErrorsErrors>();
   o.add(buildManagedInstanceLastAttemptErrorsErrors());
   o.add(buildManagedInstanceLastAttemptErrorsErrors());
   return o;
 }
 
-checkUnnamed2349(core.List<api.ManagedInstanceLastAttemptErrorsErrors> o) {
+checkUnnamed2336(core.List<api.ManagedInstanceLastAttemptErrorsErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedInstanceLastAttemptErrorsErrors(o[0]);
   checkManagedInstanceLastAttemptErrorsErrors(o[1]);
@@ -5286,7 +5313,7 @@
   var o = new api.ManagedInstanceLastAttemptErrors();
   buildCounterManagedInstanceLastAttemptErrors++;
   if (buildCounterManagedInstanceLastAttemptErrors < 3) {
-    o.errors = buildUnnamed2349();
+    o.errors = buildUnnamed2336();
   }
   buildCounterManagedInstanceLastAttemptErrors--;
   return o;
@@ -5295,7 +5322,7 @@
 checkManagedInstanceLastAttemptErrors(api.ManagedInstanceLastAttemptErrors o) {
   buildCounterManagedInstanceLastAttemptErrors++;
   if (buildCounterManagedInstanceLastAttemptErrors < 3) {
-    checkUnnamed2349(o.errors);
+    checkUnnamed2336(o.errors);
   }
   buildCounterManagedInstanceLastAttemptErrors--;
 }
@@ -5340,14 +5367,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed2350() {
+buildUnnamed2337() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed2350(core.List<api.MetadataItems> o) {
+checkUnnamed2337(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -5359,7 +5386,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed2350();
+    o.items = buildUnnamed2337();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -5370,7 +5397,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2350(o.items);
+    checkUnnamed2337(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -5397,27 +5424,27 @@
   buildCounterNamedPort--;
 }
 
-buildUnnamed2351() {
+buildUnnamed2338() {
   var o = new core.List<api.NetworkPeering>();
   o.add(buildNetworkPeering());
   o.add(buildNetworkPeering());
   return o;
 }
 
-checkUnnamed2351(core.List<api.NetworkPeering> o) {
+checkUnnamed2338(core.List<api.NetworkPeering> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkPeering(o[0]);
   checkNetworkPeering(o[1]);
 }
 
-buildUnnamed2352() {
+buildUnnamed2339() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2352(core.List<core.String> o) {
+checkUnnamed2339(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5436,9 +5463,9 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.peerings = buildUnnamed2351();
+    o.peerings = buildUnnamed2338();
     o.selfLink = "foo";
-    o.subnetworks = buildUnnamed2352();
+    o.subnetworks = buildUnnamed2339();
   }
   buildCounterNetwork--;
   return o;
@@ -5455,34 +5482,34 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2351(o.peerings);
+    checkUnnamed2338(o.peerings);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2352(o.subnetworks);
+    checkUnnamed2339(o.subnetworks);
   }
   buildCounterNetwork--;
 }
 
-buildUnnamed2353() {
+buildUnnamed2340() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed2353(core.List<api.AccessConfig> o) {
+checkUnnamed2340(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
 }
 
-buildUnnamed2354() {
+buildUnnamed2341() {
   var o = new core.List<api.AliasIpRange>();
   o.add(buildAliasIpRange());
   o.add(buildAliasIpRange());
   return o;
 }
 
-checkUnnamed2354(core.List<api.AliasIpRange> o) {
+checkUnnamed2341(core.List<api.AliasIpRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAliasIpRange(o[0]);
   checkAliasIpRange(o[1]);
@@ -5493,8 +5520,8 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed2353();
-    o.aliasIpRanges = buildUnnamed2354();
+    o.accessConfigs = buildUnnamed2340();
+    o.aliasIpRanges = buildUnnamed2341();
     o.kind = "foo";
     o.name = "foo";
     o.network = "foo";
@@ -5508,8 +5535,8 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed2353(o.accessConfigs);
-    checkUnnamed2354(o.aliasIpRanges);
+    checkUnnamed2340(o.accessConfigs);
+    checkUnnamed2341(o.aliasIpRanges);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
@@ -5519,14 +5546,14 @@
   buildCounterNetworkInterface--;
 }
 
-buildUnnamed2355() {
+buildUnnamed2342() {
   var o = new core.List<api.Network>();
   o.add(buildNetwork());
   o.add(buildNetwork());
   return o;
 }
 
-checkUnnamed2355(core.List<api.Network> o) {
+checkUnnamed2342(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetwork(o[0]);
   checkNetwork(o[1]);
@@ -5538,7 +5565,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2355();
+    o.items = buildUnnamed2342();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5551,7 +5578,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2355(o.items);
+    checkUnnamed2342(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5651,14 +5678,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed2356() {
+buildUnnamed2343() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed2356(core.List<api.OperationErrorErrors> o) {
+checkUnnamed2343(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -5669,7 +5696,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed2356();
+    o.errors = buildUnnamed2343();
   }
   buildCounterOperationError--;
   return o;
@@ -5678,7 +5705,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed2356(o.errors);
+    checkUnnamed2343(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -5704,14 +5731,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed2357() {
+buildUnnamed2344() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed2357(core.List<api.OperationWarningsData> o) {
+checkUnnamed2344(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -5723,7 +5750,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2357();
+    o.data = buildUnnamed2344();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -5734,20 +5761,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2357(o.data);
+    checkUnnamed2344(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed2358() {
+buildUnnamed2345() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed2358(core.List<api.OperationWarnings> o) {
+checkUnnamed2345(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -5779,7 +5806,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed2358();
+    o.warnings = buildUnnamed2345();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -5810,20 +5837,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2358(o.warnings);
+    checkUnnamed2345(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2359() {
+buildUnnamed2346() {
   var o = new core.Map<core.String, api.OperationsScopedList>();
   o["x"] = buildOperationsScopedList();
   o["y"] = buildOperationsScopedList();
   return o;
 }
 
-checkUnnamed2359(core.Map<core.String, api.OperationsScopedList> o) {
+checkUnnamed2346(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedList(o["x"]);
   checkOperationsScopedList(o["y"]);
@@ -5835,7 +5862,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2359();
+    o.items = buildUnnamed2346();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5848,7 +5875,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2359(o.items);
+    checkUnnamed2346(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5856,14 +5883,14 @@
   buildCounterOperationAggregatedList--;
 }
 
-buildUnnamed2360() {
+buildUnnamed2347() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2360(core.List<api.Operation> o) {
+checkUnnamed2347(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -5875,7 +5902,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2360();
+    o.items = buildUnnamed2347();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -5888,7 +5915,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2360(o.items);
+    checkUnnamed2347(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5896,14 +5923,14 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed2361() {
+buildUnnamed2348() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2361(core.List<api.Operation> o) {
+checkUnnamed2348(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -5930,14 +5957,14 @@
   buildCounterOperationsScopedListWarningData--;
 }
 
-buildUnnamed2362() {
+buildUnnamed2349() {
   var o = new core.List<api.OperationsScopedListWarningData>();
   o.add(buildOperationsScopedListWarningData());
   o.add(buildOperationsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2362(core.List<api.OperationsScopedListWarningData> o) {
+checkUnnamed2349(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedListWarningData(o[0]);
   checkOperationsScopedListWarningData(o[1]);
@@ -5949,7 +5976,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2362();
+    o.data = buildUnnamed2349();
     o.message = "foo";
   }
   buildCounterOperationsScopedListWarning--;
@@ -5960,7 +5987,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2362(o.data);
+    checkUnnamed2349(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationsScopedListWarning--;
@@ -5971,7 +5998,7 @@
   var o = new api.OperationsScopedList();
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    o.operations = buildUnnamed2361();
+    o.operations = buildUnnamed2348();
     o.warning = buildOperationsScopedListWarning();
   }
   buildCounterOperationsScopedList--;
@@ -5981,20 +6008,20 @@
 checkOperationsScopedList(api.OperationsScopedList o) {
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    checkUnnamed2361(o.operations);
+    checkUnnamed2348(o.operations);
     checkOperationsScopedListWarning(o.warning);
   }
   buildCounterOperationsScopedList--;
 }
 
-buildUnnamed2363() {
+buildUnnamed2350() {
   var o = new core.List<api.PathRule>();
   o.add(buildPathRule());
   o.add(buildPathRule());
   return o;
 }
 
-checkUnnamed2363(core.List<api.PathRule> o) {
+checkUnnamed2350(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathRule(o[0]);
   checkPathRule(o[1]);
@@ -6008,7 +6035,7 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.name = "foo";
-    o.pathRules = buildUnnamed2363();
+    o.pathRules = buildUnnamed2350();
   }
   buildCounterPathMatcher--;
   return o;
@@ -6020,19 +6047,19 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2363(o.pathRules);
+    checkUnnamed2350(o.pathRules);
   }
   buildCounterPathMatcher--;
 }
 
-buildUnnamed2364() {
+buildUnnamed2351() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2364(core.List<core.String> o) {
+checkUnnamed2351(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6043,7 +6070,7 @@
   var o = new api.PathRule();
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    o.paths = buildUnnamed2364();
+    o.paths = buildUnnamed2351();
     o.service = "foo";
   }
   buildCounterPathRule--;
@@ -6053,33 +6080,33 @@
 checkPathRule(api.PathRule o) {
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    checkUnnamed2364(o.paths);
+    checkUnnamed2351(o.paths);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterPathRule--;
 }
 
-buildUnnamed2365() {
+buildUnnamed2352() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2365(core.List<core.String> o) {
+checkUnnamed2352(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2366() {
+buildUnnamed2353() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed2366(core.List<api.Quota> o) {
+checkUnnamed2353(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
@@ -6094,11 +6121,11 @@
     o.creationTimestamp = "foo";
     o.defaultServiceAccount = "foo";
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed2365();
+    o.enabledFeatures = buildUnnamed2352();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed2366();
+    o.quotas = buildUnnamed2353();
     o.selfLink = "foo";
     o.usageExportLocation = buildUsageExportLocation();
     o.xpnProjectStatus = "foo";
@@ -6114,11 +6141,11 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.defaultServiceAccount, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2365(o.enabledFeatures);
+    checkUnnamed2352(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2366(o.quotas);
+    checkUnnamed2353(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUsageExportLocation(o.usageExportLocation);
     unittest.expect(o.xpnProjectStatus, unittest.equals('foo'));
@@ -6137,7 +6164,8 @@
   return o;
 }
 
-checkProjectsDisableXpnResourceRequest(api.ProjectsDisableXpnResourceRequest o) {
+checkProjectsDisableXpnResourceRequest(
+    api.ProjectsDisableXpnResourceRequest o) {
   buildCounterProjectsDisableXpnResourceRequest++;
   if (buildCounterProjectsDisableXpnResourceRequest < 3) {
     checkXpnResourceId(o.xpnResource);
@@ -6164,14 +6192,14 @@
   buildCounterProjectsEnableXpnResourceRequest--;
 }
 
-buildUnnamed2367() {
+buildUnnamed2354() {
   var o = new core.List<api.XpnResourceId>();
   o.add(buildXpnResourceId());
   o.add(buildXpnResourceId());
   return o;
 }
 
-checkUnnamed2367(core.List<api.XpnResourceId> o) {
+checkUnnamed2354(core.List<api.XpnResourceId> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkXpnResourceId(o[0]);
   checkXpnResourceId(o[1]);
@@ -6184,7 +6212,7 @@
   if (buildCounterProjectsGetXpnResources < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed2367();
+    o.resources = buildUnnamed2354();
   }
   buildCounterProjectsGetXpnResources--;
   return o;
@@ -6195,7 +6223,7 @@
   if (buildCounterProjectsGetXpnResources < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2367(o.resources);
+    checkUnnamed2354(o.resources);
   }
   buildCounterProjectsGetXpnResources--;
 }
@@ -6242,27 +6270,27 @@
   buildCounterQuota--;
 }
 
-buildUnnamed2368() {
+buildUnnamed2355() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed2368(core.List<api.Quota> o) {
+checkUnnamed2355(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
 }
 
-buildUnnamed2369() {
+buildUnnamed2356() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2369(core.List<core.String> o) {
+checkUnnamed2356(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6279,10 +6307,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed2368();
+    o.quotas = buildUnnamed2355();
     o.selfLink = "foo";
     o.status = "foo";
-    o.zones = buildUnnamed2369();
+    o.zones = buildUnnamed2356();
   }
   buildCounterRegion--;
   return o;
@@ -6297,22 +6325,22 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2368(o.quotas);
+    checkUnnamed2355(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2369(o.zones);
+    checkUnnamed2356(o.zones);
   }
   buildCounterRegion--;
 }
 
-buildUnnamed2370() {
+buildUnnamed2357() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed2370(core.List<api.Autoscaler> o) {
+checkUnnamed2357(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -6324,7 +6352,7 @@
   buildCounterRegionAutoscalerList++;
   if (buildCounterRegionAutoscalerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2370();
+    o.items = buildUnnamed2357();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6337,7 +6365,7 @@
   buildCounterRegionAutoscalerList++;
   if (buildCounterRegionAutoscalerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2370(o.items);
+    checkUnnamed2357(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6345,14 +6373,14 @@
   buildCounterRegionAutoscalerList--;
 }
 
-buildUnnamed2371() {
+buildUnnamed2358() {
   var o = new core.List<api.InstanceGroup>();
   o.add(buildInstanceGroup());
   o.add(buildInstanceGroup());
   return o;
 }
 
-checkUnnamed2371(core.List<api.InstanceGroup> o) {
+checkUnnamed2358(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroup(o[0]);
   checkInstanceGroup(o[1]);
@@ -6364,7 +6392,7 @@
   buildCounterRegionInstanceGroupList++;
   if (buildCounterRegionInstanceGroupList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2371();
+    o.items = buildUnnamed2358();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6377,7 +6405,7 @@
   buildCounterRegionInstanceGroupList++;
   if (buildCounterRegionInstanceGroupList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2371(o.items);
+    checkUnnamed2358(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6385,14 +6413,14 @@
   buildCounterRegionInstanceGroupList--;
 }
 
-buildUnnamed2372() {
+buildUnnamed2359() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed2372(core.List<api.InstanceGroupManager> o) {
+checkUnnamed2359(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -6404,7 +6432,7 @@
   buildCounterRegionInstanceGroupManagerList++;
   if (buildCounterRegionInstanceGroupManagerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2372();
+    o.items = buildUnnamed2359();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6417,7 +6445,7 @@
   buildCounterRegionInstanceGroupManagerList++;
   if (buildCounterRegionInstanceGroupManagerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2372(o.items);
+    checkUnnamed2359(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6425,14 +6453,14 @@
   buildCounterRegionInstanceGroupManagerList--;
 }
 
-buildUnnamed2373() {
+buildUnnamed2360() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2373(core.List<core.String> o) {
+checkUnnamed2360(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6443,28 +6471,29 @@
   var o = new api.RegionInstanceGroupManagersAbandonInstancesRequest();
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersAbandonInstancesRequest < 3) {
-    o.instances = buildUnnamed2373();
+    o.instances = buildUnnamed2360();
   }
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest--;
   return o;
 }
 
-checkRegionInstanceGroupManagersAbandonInstancesRequest(api.RegionInstanceGroupManagersAbandonInstancesRequest o) {
+checkRegionInstanceGroupManagersAbandonInstancesRequest(
+    api.RegionInstanceGroupManagersAbandonInstancesRequest o) {
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersAbandonInstancesRequest < 3) {
-    checkUnnamed2373(o.instances);
+    checkUnnamed2360(o.instances);
   }
   buildCounterRegionInstanceGroupManagersAbandonInstancesRequest--;
 }
 
-buildUnnamed2374() {
+buildUnnamed2361() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2374(core.List<core.String> o) {
+checkUnnamed2361(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6475,28 +6504,29 @@
   var o = new api.RegionInstanceGroupManagersDeleteInstancesRequest();
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersDeleteInstancesRequest < 3) {
-    o.instances = buildUnnamed2374();
+    o.instances = buildUnnamed2361();
   }
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest--;
   return o;
 }
 
-checkRegionInstanceGroupManagersDeleteInstancesRequest(api.RegionInstanceGroupManagersDeleteInstancesRequest o) {
+checkRegionInstanceGroupManagersDeleteInstancesRequest(
+    api.RegionInstanceGroupManagersDeleteInstancesRequest o) {
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterRegionInstanceGroupManagersDeleteInstancesRequest < 3) {
-    checkUnnamed2374(o.instances);
+    checkUnnamed2361(o.instances);
   }
   buildCounterRegionInstanceGroupManagersDeleteInstancesRequest--;
 }
 
-buildUnnamed2375() {
+buildUnnamed2362() {
   var o = new core.List<api.ManagedInstance>();
   o.add(buildManagedInstance());
   o.add(buildManagedInstance());
   return o;
 }
 
-checkUnnamed2375(core.List<api.ManagedInstance> o) {
+checkUnnamed2362(core.List<api.ManagedInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedInstance(o[0]);
   checkManagedInstance(o[1]);
@@ -6507,28 +6537,29 @@
   var o = new api.RegionInstanceGroupManagersListInstancesResponse();
   buildCounterRegionInstanceGroupManagersListInstancesResponse++;
   if (buildCounterRegionInstanceGroupManagersListInstancesResponse < 3) {
-    o.managedInstances = buildUnnamed2375();
+    o.managedInstances = buildUnnamed2362();
   }
   buildCounterRegionInstanceGroupManagersListInstancesResponse--;
   return o;
 }
 
-checkRegionInstanceGroupManagersListInstancesResponse(api.RegionInstanceGroupManagersListInstancesResponse o) {
+checkRegionInstanceGroupManagersListInstancesResponse(
+    api.RegionInstanceGroupManagersListInstancesResponse o) {
   buildCounterRegionInstanceGroupManagersListInstancesResponse++;
   if (buildCounterRegionInstanceGroupManagersListInstancesResponse < 3) {
-    checkUnnamed2375(o.managedInstances);
+    checkUnnamed2362(o.managedInstances);
   }
   buildCounterRegionInstanceGroupManagersListInstancesResponse--;
 }
 
-buildUnnamed2376() {
+buildUnnamed2363() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2376(core.List<core.String> o) {
+checkUnnamed2363(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6539,28 +6570,29 @@
   var o = new api.RegionInstanceGroupManagersRecreateRequest();
   buildCounterRegionInstanceGroupManagersRecreateRequest++;
   if (buildCounterRegionInstanceGroupManagersRecreateRequest < 3) {
-    o.instances = buildUnnamed2376();
+    o.instances = buildUnnamed2363();
   }
   buildCounterRegionInstanceGroupManagersRecreateRequest--;
   return o;
 }
 
-checkRegionInstanceGroupManagersRecreateRequest(api.RegionInstanceGroupManagersRecreateRequest o) {
+checkRegionInstanceGroupManagersRecreateRequest(
+    api.RegionInstanceGroupManagersRecreateRequest o) {
   buildCounterRegionInstanceGroupManagersRecreateRequest++;
   if (buildCounterRegionInstanceGroupManagersRecreateRequest < 3) {
-    checkUnnamed2376(o.instances);
+    checkUnnamed2363(o.instances);
   }
   buildCounterRegionInstanceGroupManagersRecreateRequest--;
 }
 
-buildUnnamed2377() {
+buildUnnamed2364() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2377(core.List<core.String> o) {
+checkUnnamed2364(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6572,17 +6604,18 @@
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest < 3) {
     o.fingerprint = "foo";
-    o.targetPools = buildUnnamed2377();
+    o.targetPools = buildUnnamed2364();
   }
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest--;
   return o;
 }
 
-checkRegionInstanceGroupManagersSetTargetPoolsRequest(api.RegionInstanceGroupManagersSetTargetPoolsRequest o) {
+checkRegionInstanceGroupManagersSetTargetPoolsRequest(
+    api.RegionInstanceGroupManagersSetTargetPoolsRequest o) {
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2377(o.targetPools);
+    checkUnnamed2364(o.targetPools);
   }
   buildCounterRegionInstanceGroupManagersSetTargetPoolsRequest--;
 }
@@ -6598,7 +6631,8 @@
   return o;
 }
 
-checkRegionInstanceGroupManagersSetTemplateRequest(api.RegionInstanceGroupManagersSetTemplateRequest o) {
+checkRegionInstanceGroupManagersSetTemplateRequest(
+    api.RegionInstanceGroupManagersSetTemplateRequest o) {
   buildCounterRegionInstanceGroupManagersSetTemplateRequest++;
   if (buildCounterRegionInstanceGroupManagersSetTemplateRequest < 3) {
     unittest.expect(o.instanceTemplate, unittest.equals('foo'));
@@ -6606,14 +6640,14 @@
   buildCounterRegionInstanceGroupManagersSetTemplateRequest--;
 }
 
-buildUnnamed2378() {
+buildUnnamed2365() {
   var o = new core.List<api.InstanceWithNamedPorts>();
   o.add(buildInstanceWithNamedPorts());
   o.add(buildInstanceWithNamedPorts());
   return o;
 }
 
-checkUnnamed2378(core.List<api.InstanceWithNamedPorts> o) {
+checkUnnamed2365(core.List<api.InstanceWithNamedPorts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceWithNamedPorts(o[0]);
   checkInstanceWithNamedPorts(o[1]);
@@ -6625,7 +6659,7 @@
   buildCounterRegionInstanceGroupsListInstances++;
   if (buildCounterRegionInstanceGroupsListInstances < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2378();
+    o.items = buildUnnamed2365();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6634,11 +6668,12 @@
   return o;
 }
 
-checkRegionInstanceGroupsListInstances(api.RegionInstanceGroupsListInstances o) {
+checkRegionInstanceGroupsListInstances(
+    api.RegionInstanceGroupsListInstances o) {
   buildCounterRegionInstanceGroupsListInstances++;
   if (buildCounterRegionInstanceGroupsListInstances < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2378(o.items);
+    checkUnnamed2365(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6658,7 +6693,8 @@
   return o;
 }
 
-checkRegionInstanceGroupsListInstancesRequest(api.RegionInstanceGroupsListInstancesRequest o) {
+checkRegionInstanceGroupsListInstancesRequest(
+    api.RegionInstanceGroupsListInstancesRequest o) {
   buildCounterRegionInstanceGroupsListInstancesRequest++;
   if (buildCounterRegionInstanceGroupsListInstancesRequest < 3) {
     unittest.expect(o.instanceState, unittest.equals('foo'));
@@ -6667,14 +6703,14 @@
   buildCounterRegionInstanceGroupsListInstancesRequest--;
 }
 
-buildUnnamed2379() {
+buildUnnamed2366() {
   var o = new core.List<api.NamedPort>();
   o.add(buildNamedPort());
   o.add(buildNamedPort());
   return o;
 }
 
-checkUnnamed2379(core.List<api.NamedPort> o) {
+checkUnnamed2366(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNamedPort(o[0]);
   checkNamedPort(o[1]);
@@ -6686,29 +6722,30 @@
   buildCounterRegionInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterRegionInstanceGroupsSetNamedPortsRequest < 3) {
     o.fingerprint = "foo";
-    o.namedPorts = buildUnnamed2379();
+    o.namedPorts = buildUnnamed2366();
   }
   buildCounterRegionInstanceGroupsSetNamedPortsRequest--;
   return o;
 }
 
-checkRegionInstanceGroupsSetNamedPortsRequest(api.RegionInstanceGroupsSetNamedPortsRequest o) {
+checkRegionInstanceGroupsSetNamedPortsRequest(
+    api.RegionInstanceGroupsSetNamedPortsRequest o) {
   buildCounterRegionInstanceGroupsSetNamedPortsRequest++;
   if (buildCounterRegionInstanceGroupsSetNamedPortsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2379(o.namedPorts);
+    checkUnnamed2366(o.namedPorts);
   }
   buildCounterRegionInstanceGroupsSetNamedPortsRequest--;
 }
 
-buildUnnamed2380() {
+buildUnnamed2367() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed2380(core.List<api.Region> o) {
+checkUnnamed2367(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -6720,7 +6757,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2380();
+    o.items = buildUnnamed2367();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6733,7 +6770,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2380(o.items);
+    checkUnnamed2367(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6781,14 +6818,14 @@
   buildCounterResourceGroupReference--;
 }
 
-buildUnnamed2381() {
+buildUnnamed2368() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2381(core.List<core.String> o) {
+checkUnnamed2368(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -6815,14 +6852,14 @@
   buildCounterRouteWarningsData--;
 }
 
-buildUnnamed2382() {
+buildUnnamed2369() {
   var o = new core.List<api.RouteWarningsData>();
   o.add(buildRouteWarningsData());
   o.add(buildRouteWarningsData());
   return o;
 }
 
-checkUnnamed2382(core.List<api.RouteWarningsData> o) {
+checkUnnamed2369(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarningsData(o[0]);
   checkRouteWarningsData(o[1]);
@@ -6834,7 +6871,7 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2382();
+    o.data = buildUnnamed2369();
     o.message = "foo";
   }
   buildCounterRouteWarnings--;
@@ -6845,20 +6882,20 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2382(o.data);
+    checkUnnamed2369(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteWarnings--;
 }
 
-buildUnnamed2383() {
+buildUnnamed2370() {
   var o = new core.List<api.RouteWarnings>();
   o.add(buildRouteWarnings());
   o.add(buildRouteWarnings());
   return o;
 }
 
-checkUnnamed2383(core.List<api.RouteWarnings> o) {
+checkUnnamed2370(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarnings(o[0]);
   checkRouteWarnings(o[1]);
@@ -6884,8 +6921,8 @@
     o.nextHopVpnTunnel = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.tags = buildUnnamed2381();
-    o.warnings = buildUnnamed2383();
+    o.tags = buildUnnamed2368();
+    o.warnings = buildUnnamed2370();
   }
   buildCounterRoute--;
   return o;
@@ -6909,20 +6946,20 @@
     unittest.expect(o.nextHopVpnTunnel, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2381(o.tags);
-    checkUnnamed2383(o.warnings);
+    checkUnnamed2368(o.tags);
+    checkUnnamed2370(o.warnings);
   }
   buildCounterRoute--;
 }
 
-buildUnnamed2384() {
+buildUnnamed2371() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2384(core.List<api.Route> o) {
+checkUnnamed2371(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -6934,7 +6971,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2384();
+    o.items = buildUnnamed2371();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -6947,7 +6984,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2384(o.items);
+    checkUnnamed2371(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -6955,27 +6992,27 @@
   buildCounterRouteList--;
 }
 
-buildUnnamed2385() {
+buildUnnamed2372() {
   var o = new core.List<api.RouterBgpPeer>();
   o.add(buildRouterBgpPeer());
   o.add(buildRouterBgpPeer());
   return o;
 }
 
-checkUnnamed2385(core.List<api.RouterBgpPeer> o) {
+checkUnnamed2372(core.List<api.RouterBgpPeer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterBgpPeer(o[0]);
   checkRouterBgpPeer(o[1]);
 }
 
-buildUnnamed2386() {
+buildUnnamed2373() {
   var o = new core.List<api.RouterInterface>();
   o.add(buildRouterInterface());
   o.add(buildRouterInterface());
   return o;
 }
 
-checkUnnamed2386(core.List<api.RouterInterface> o) {
+checkUnnamed2373(core.List<api.RouterInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterInterface(o[0]);
   checkRouterInterface(o[1]);
@@ -6987,11 +7024,11 @@
   buildCounterRouter++;
   if (buildCounterRouter < 3) {
     o.bgp = buildRouterBgp();
-    o.bgpPeers = buildUnnamed2385();
+    o.bgpPeers = buildUnnamed2372();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
-    o.interfaces = buildUnnamed2386();
+    o.interfaces = buildUnnamed2373();
     o.kind = "foo";
     o.name = "foo";
     o.network = "foo";
@@ -7006,11 +7043,11 @@
   buildCounterRouter++;
   if (buildCounterRouter < 3) {
     checkRouterBgp(o.bgp);
-    checkUnnamed2385(o.bgpPeers);
+    checkUnnamed2372(o.bgpPeers);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2386(o.interfaces);
+    checkUnnamed2373(o.interfaces);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
@@ -7020,14 +7057,14 @@
   buildCounterRouter--;
 }
 
-buildUnnamed2387() {
+buildUnnamed2374() {
   var o = new core.Map<core.String, api.RoutersScopedList>();
   o["x"] = buildRoutersScopedList();
   o["y"] = buildRoutersScopedList();
   return o;
 }
 
-checkUnnamed2387(core.Map<core.String, api.RoutersScopedList> o) {
+checkUnnamed2374(core.Map<core.String, api.RoutersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoutersScopedList(o["x"]);
   checkRoutersScopedList(o["y"]);
@@ -7039,7 +7076,7 @@
   buildCounterRouterAggregatedList++;
   if (buildCounterRouterAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2387();
+    o.items = buildUnnamed2374();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7052,7 +7089,7 @@
   buildCounterRouterAggregatedList++;
   if (buildCounterRouterAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2387(o.items);
+    checkUnnamed2374(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7131,14 +7168,14 @@
   buildCounterRouterInterface--;
 }
 
-buildUnnamed2388() {
+buildUnnamed2375() {
   var o = new core.List<api.Router>();
   o.add(buildRouter());
   o.add(buildRouter());
   return o;
 }
 
-checkUnnamed2388(core.List<api.Router> o) {
+checkUnnamed2375(core.List<api.Router> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouter(o[0]);
   checkRouter(o[1]);
@@ -7150,7 +7187,7 @@
   buildCounterRouterList++;
   if (buildCounterRouterList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2388();
+    o.items = buildUnnamed2375();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7163,7 +7200,7 @@
   buildCounterRouterList++;
   if (buildCounterRouterList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2388(o.items);
+    checkUnnamed2375(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7171,40 +7208,40 @@
   buildCounterRouterList--;
 }
 
-buildUnnamed2389() {
+buildUnnamed2376() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2389(core.List<api.Route> o) {
+checkUnnamed2376(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
 }
 
-buildUnnamed2390() {
+buildUnnamed2377() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2390(core.List<api.Route> o) {
+checkUnnamed2377(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
 }
 
-buildUnnamed2391() {
+buildUnnamed2378() {
   var o = new core.List<api.RouterStatusBgpPeerStatus>();
   o.add(buildRouterStatusBgpPeerStatus());
   o.add(buildRouterStatusBgpPeerStatus());
   return o;
 }
 
-checkUnnamed2391(core.List<api.RouterStatusBgpPeerStatus> o) {
+checkUnnamed2378(core.List<api.RouterStatusBgpPeerStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouterStatusBgpPeerStatus(o[0]);
   checkRouterStatusBgpPeerStatus(o[1]);
@@ -7215,9 +7252,9 @@
   var o = new api.RouterStatus();
   buildCounterRouterStatus++;
   if (buildCounterRouterStatus < 3) {
-    o.bestRoutes = buildUnnamed2389();
-    o.bestRoutesForRouter = buildUnnamed2390();
-    o.bgpPeerStatus = buildUnnamed2391();
+    o.bestRoutes = buildUnnamed2376();
+    o.bestRoutesForRouter = buildUnnamed2377();
+    o.bgpPeerStatus = buildUnnamed2378();
     o.network = "foo";
   }
   buildCounterRouterStatus--;
@@ -7227,22 +7264,22 @@
 checkRouterStatus(api.RouterStatus o) {
   buildCounterRouterStatus++;
   if (buildCounterRouterStatus < 3) {
-    checkUnnamed2389(o.bestRoutes);
-    checkUnnamed2390(o.bestRoutesForRouter);
-    checkUnnamed2391(o.bgpPeerStatus);
+    checkUnnamed2376(o.bestRoutes);
+    checkUnnamed2377(o.bestRoutesForRouter);
+    checkUnnamed2378(o.bgpPeerStatus);
     unittest.expect(o.network, unittest.equals('foo'));
   }
   buildCounterRouterStatus--;
 }
 
-buildUnnamed2392() {
+buildUnnamed2379() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed2392(core.List<api.Route> o) {
+checkUnnamed2379(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -7253,7 +7290,7 @@
   var o = new api.RouterStatusBgpPeerStatus();
   buildCounterRouterStatusBgpPeerStatus++;
   if (buildCounterRouterStatusBgpPeerStatus < 3) {
-    o.advertisedRoutes = buildUnnamed2392();
+    o.advertisedRoutes = buildUnnamed2379();
     o.ipAddress = "foo";
     o.linkedVpnTunnel = "foo";
     o.name = "foo";
@@ -7271,7 +7308,7 @@
 checkRouterStatusBgpPeerStatus(api.RouterStatusBgpPeerStatus o) {
   buildCounterRouterStatusBgpPeerStatus++;
   if (buildCounterRouterStatusBgpPeerStatus < 3) {
-    checkUnnamed2392(o.advertisedRoutes);
+    checkUnnamed2379(o.advertisedRoutes);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.linkedVpnTunnel, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -7325,14 +7362,14 @@
   buildCounterRoutersPreviewResponse--;
 }
 
-buildUnnamed2393() {
+buildUnnamed2380() {
   var o = new core.List<api.Router>();
   o.add(buildRouter());
   o.add(buildRouter());
   return o;
 }
 
-checkUnnamed2393(core.List<api.Router> o) {
+checkUnnamed2380(core.List<api.Router> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouter(o[0]);
   checkRouter(o[1]);
@@ -7359,14 +7396,14 @@
   buildCounterRoutersScopedListWarningData--;
 }
 
-buildUnnamed2394() {
+buildUnnamed2381() {
   var o = new core.List<api.RoutersScopedListWarningData>();
   o.add(buildRoutersScopedListWarningData());
   o.add(buildRoutersScopedListWarningData());
   return o;
 }
 
-checkUnnamed2394(core.List<api.RoutersScopedListWarningData> o) {
+checkUnnamed2381(core.List<api.RoutersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoutersScopedListWarningData(o[0]);
   checkRoutersScopedListWarningData(o[1]);
@@ -7378,7 +7415,7 @@
   buildCounterRoutersScopedListWarning++;
   if (buildCounterRoutersScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2394();
+    o.data = buildUnnamed2381();
     o.message = "foo";
   }
   buildCounterRoutersScopedListWarning--;
@@ -7389,7 +7426,7 @@
   buildCounterRoutersScopedListWarning++;
   if (buildCounterRoutersScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2394(o.data);
+    checkUnnamed2381(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRoutersScopedListWarning--;
@@ -7400,7 +7437,7 @@
   var o = new api.RoutersScopedList();
   buildCounterRoutersScopedList++;
   if (buildCounterRoutersScopedList < 3) {
-    o.routers = buildUnnamed2393();
+    o.routers = buildUnnamed2380();
     o.warning = buildRoutersScopedListWarning();
   }
   buildCounterRoutersScopedList--;
@@ -7410,7 +7447,7 @@
 checkRoutersScopedList(api.RoutersScopedList o) {
   buildCounterRoutersScopedList++;
   if (buildCounterRoutersScopedList < 3) {
-    checkUnnamed2393(o.routers);
+    checkUnnamed2380(o.routers);
     checkRoutersScopedListWarning(o.warning);
   }
   buildCounterRoutersScopedList--;
@@ -7493,14 +7530,14 @@
   buildCounterSerialPortOutput--;
 }
 
-buildUnnamed2395() {
+buildUnnamed2382() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2395(core.List<core.String> o) {
+checkUnnamed2382(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7512,7 +7549,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed2395();
+    o.scopes = buildUnnamed2382();
   }
   buildCounterServiceAccount--;
   return o;
@@ -7522,32 +7559,32 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed2395(o.scopes);
+    checkUnnamed2382(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed2396() {
+buildUnnamed2383() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2396(core.Map<core.String, core.String> o) {
+checkUnnamed2383(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2397() {
+buildUnnamed2384() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2397(core.List<core.String> o) {
+checkUnnamed2384(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -7564,8 +7601,8 @@
     o.id = "foo";
     o.kind = "foo";
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2396();
-    o.licenses = buildUnnamed2397();
+    o.labels = buildUnnamed2383();
+    o.licenses = buildUnnamed2384();
     o.name = "foo";
     o.selfLink = "foo";
     o.snapshotEncryptionKey = buildCustomerEncryptionKey();
@@ -7589,8 +7626,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2396(o.labels);
-    checkUnnamed2397(o.licenses);
+    checkUnnamed2383(o.labels);
+    checkUnnamed2384(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkCustomerEncryptionKey(o.snapshotEncryptionKey);
@@ -7604,14 +7641,14 @@
   buildCounterSnapshot--;
 }
 
-buildUnnamed2398() {
+buildUnnamed2385() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed2398(core.List<api.Snapshot> o) {
+checkUnnamed2385(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -7623,7 +7660,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2398();
+    o.items = buildUnnamed2385();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7636,7 +7673,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2398(o.items);
+    checkUnnamed2385(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7677,14 +7714,14 @@
   buildCounterSslCertificate--;
 }
 
-buildUnnamed2399() {
+buildUnnamed2386() {
   var o = new core.List<api.SslCertificate>();
   o.add(buildSslCertificate());
   o.add(buildSslCertificate());
   return o;
 }
 
-checkUnnamed2399(core.List<api.SslCertificate> o) {
+checkUnnamed2386(core.List<api.SslCertificate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCertificate(o[0]);
   checkSslCertificate(o[1]);
@@ -7696,7 +7733,7 @@
   buildCounterSslCertificateList++;
   if (buildCounterSslCertificateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2399();
+    o.items = buildUnnamed2386();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7709,7 +7746,7 @@
   buildCounterSslCertificateList++;
   if (buildCounterSslCertificateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2399(o.items);
+    checkUnnamed2386(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7717,14 +7754,14 @@
   buildCounterSslCertificateList--;
 }
 
-buildUnnamed2400() {
+buildUnnamed2387() {
   var o = new core.List<api.SubnetworkSecondaryRange>();
   o.add(buildSubnetworkSecondaryRange());
   o.add(buildSubnetworkSecondaryRange());
   return o;
 }
 
-checkUnnamed2400(core.List<api.SubnetworkSecondaryRange> o) {
+checkUnnamed2387(core.List<api.SubnetworkSecondaryRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworkSecondaryRange(o[0]);
   checkSubnetworkSecondaryRange(o[1]);
@@ -7745,7 +7782,7 @@
     o.network = "foo";
     o.privateIpGoogleAccess = true;
     o.region = "foo";
-    o.secondaryIpRanges = buildUnnamed2400();
+    o.secondaryIpRanges = buildUnnamed2387();
     o.selfLink = "foo";
   }
   buildCounterSubnetwork--;
@@ -7765,20 +7802,20 @@
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.privateIpGoogleAccess, unittest.isTrue);
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed2400(o.secondaryIpRanges);
+    checkUnnamed2387(o.secondaryIpRanges);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterSubnetwork--;
 }
 
-buildUnnamed2401() {
+buildUnnamed2388() {
   var o = new core.Map<core.String, api.SubnetworksScopedList>();
   o["x"] = buildSubnetworksScopedList();
   o["y"] = buildSubnetworksScopedList();
   return o;
 }
 
-checkUnnamed2401(core.Map<core.String, api.SubnetworksScopedList> o) {
+checkUnnamed2388(core.Map<core.String, api.SubnetworksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworksScopedList(o["x"]);
   checkSubnetworksScopedList(o["y"]);
@@ -7790,7 +7827,7 @@
   buildCounterSubnetworkAggregatedList++;
   if (buildCounterSubnetworkAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2401();
+    o.items = buildUnnamed2388();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7803,7 +7840,7 @@
   buildCounterSubnetworkAggregatedList++;
   if (buildCounterSubnetworkAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2401(o.items);
+    checkUnnamed2388(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7811,14 +7848,14 @@
   buildCounterSubnetworkAggregatedList--;
 }
 
-buildUnnamed2402() {
+buildUnnamed2389() {
   var o = new core.List<api.Subnetwork>();
   o.add(buildSubnetwork());
   o.add(buildSubnetwork());
   return o;
 }
 
-checkUnnamed2402(core.List<api.Subnetwork> o) {
+checkUnnamed2389(core.List<api.Subnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetwork(o[0]);
   checkSubnetwork(o[1]);
@@ -7830,7 +7867,7 @@
   buildCounterSubnetworkList++;
   if (buildCounterSubnetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2402();
+    o.items = buildUnnamed2389();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -7843,7 +7880,7 @@
   buildCounterSubnetworkList++;
   if (buildCounterSubnetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2402(o.items);
+    checkUnnamed2389(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -7883,7 +7920,8 @@
   return o;
 }
 
-checkSubnetworksExpandIpCidrRangeRequest(api.SubnetworksExpandIpCidrRangeRequest o) {
+checkSubnetworksExpandIpCidrRangeRequest(
+    api.SubnetworksExpandIpCidrRangeRequest o) {
   buildCounterSubnetworksExpandIpCidrRangeRequest++;
   if (buildCounterSubnetworksExpandIpCidrRangeRequest < 3) {
     unittest.expect(o.ipCidrRange, unittest.equals('foo'));
@@ -7891,14 +7929,14 @@
   buildCounterSubnetworksExpandIpCidrRangeRequest--;
 }
 
-buildUnnamed2403() {
+buildUnnamed2390() {
   var o = new core.List<api.Subnetwork>();
   o.add(buildSubnetwork());
   o.add(buildSubnetwork());
   return o;
 }
 
-checkUnnamed2403(core.List<api.Subnetwork> o) {
+checkUnnamed2390(core.List<api.Subnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetwork(o[0]);
   checkSubnetwork(o[1]);
@@ -7925,14 +7963,14 @@
   buildCounterSubnetworksScopedListWarningData--;
 }
 
-buildUnnamed2404() {
+buildUnnamed2391() {
   var o = new core.List<api.SubnetworksScopedListWarningData>();
   o.add(buildSubnetworksScopedListWarningData());
   o.add(buildSubnetworksScopedListWarningData());
   return o;
 }
 
-checkUnnamed2404(core.List<api.SubnetworksScopedListWarningData> o) {
+checkUnnamed2391(core.List<api.SubnetworksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubnetworksScopedListWarningData(o[0]);
   checkSubnetworksScopedListWarningData(o[1]);
@@ -7944,7 +7982,7 @@
   buildCounterSubnetworksScopedListWarning++;
   if (buildCounterSubnetworksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2404();
+    o.data = buildUnnamed2391();
     o.message = "foo";
   }
   buildCounterSubnetworksScopedListWarning--;
@@ -7955,7 +7993,7 @@
   buildCounterSubnetworksScopedListWarning++;
   if (buildCounterSubnetworksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2404(o.data);
+    checkUnnamed2391(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterSubnetworksScopedListWarning--;
@@ -7966,7 +8004,7 @@
   var o = new api.SubnetworksScopedList();
   buildCounterSubnetworksScopedList++;
   if (buildCounterSubnetworksScopedList < 3) {
-    o.subnetworks = buildUnnamed2403();
+    o.subnetworks = buildUnnamed2390();
     o.warning = buildSubnetworksScopedListWarning();
   }
   buildCounterSubnetworksScopedList--;
@@ -7976,7 +8014,7 @@
 checkSubnetworksScopedList(api.SubnetworksScopedList o) {
   buildCounterSubnetworksScopedList++;
   if (buildCounterSubnetworksScopedList < 3) {
-    checkUnnamed2403(o.subnetworks);
+    checkUnnamed2390(o.subnetworks);
     checkSubnetworksScopedListWarning(o.warning);
   }
   buildCounterSubnetworksScopedList--;
@@ -7993,7 +8031,8 @@
   return o;
 }
 
-checkSubnetworksSetPrivateIpGoogleAccessRequest(api.SubnetworksSetPrivateIpGoogleAccessRequest o) {
+checkSubnetworksSetPrivateIpGoogleAccessRequest(
+    api.SubnetworksSetPrivateIpGoogleAccessRequest o) {
   buildCounterSubnetworksSetPrivateIpGoogleAccessRequest++;
   if (buildCounterSubnetworksSetPrivateIpGoogleAccessRequest < 3) {
     unittest.expect(o.privateIpGoogleAccess, unittest.isTrue);
@@ -8028,14 +8067,14 @@
   buildCounterTCPHealthCheck--;
 }
 
-buildUnnamed2405() {
+buildUnnamed2392() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2405(core.List<core.String> o) {
+checkUnnamed2392(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8047,7 +8086,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed2405();
+    o.items = buildUnnamed2392();
   }
   buildCounterTags--;
   return o;
@@ -8057,7 +8096,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2405(o.items);
+    checkUnnamed2392(o.items);
   }
   buildCounterTags--;
 }
@@ -8093,14 +8132,14 @@
   buildCounterTargetHttpProxy--;
 }
 
-buildUnnamed2406() {
+buildUnnamed2393() {
   var o = new core.List<api.TargetHttpProxy>();
   o.add(buildTargetHttpProxy());
   o.add(buildTargetHttpProxy());
   return o;
 }
 
-checkUnnamed2406(core.List<api.TargetHttpProxy> o) {
+checkUnnamed2393(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxy(o[0]);
   checkTargetHttpProxy(o[1]);
@@ -8112,7 +8151,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2406();
+    o.items = buildUnnamed2393();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8125,7 +8164,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2406(o.items);
+    checkUnnamed2393(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8133,14 +8172,14 @@
   buildCounterTargetHttpProxyList--;
 }
 
-buildUnnamed2407() {
+buildUnnamed2394() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2407(core.List<core.String> o) {
+checkUnnamed2394(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8151,28 +8190,29 @@
   var o = new api.TargetHttpsProxiesSetSslCertificatesRequest();
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetHttpsProxiesSetSslCertificatesRequest < 3) {
-    o.sslCertificates = buildUnnamed2407();
+    o.sslCertificates = buildUnnamed2394();
   }
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest--;
   return o;
 }
 
-checkTargetHttpsProxiesSetSslCertificatesRequest(api.TargetHttpsProxiesSetSslCertificatesRequest o) {
+checkTargetHttpsProxiesSetSslCertificatesRequest(
+    api.TargetHttpsProxiesSetSslCertificatesRequest o) {
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetHttpsProxiesSetSslCertificatesRequest < 3) {
-    checkUnnamed2407(o.sslCertificates);
+    checkUnnamed2394(o.sslCertificates);
   }
   buildCounterTargetHttpsProxiesSetSslCertificatesRequest--;
 }
 
-buildUnnamed2408() {
+buildUnnamed2395() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2408(core.List<core.String> o) {
+checkUnnamed2395(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8189,7 +8229,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.selfLink = "foo";
-    o.sslCertificates = buildUnnamed2408();
+    o.sslCertificates = buildUnnamed2395();
     o.urlMap = "foo";
   }
   buildCounterTargetHttpsProxy--;
@@ -8205,20 +8245,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2408(o.sslCertificates);
+    checkUnnamed2395(o.sslCertificates);
     unittest.expect(o.urlMap, unittest.equals('foo'));
   }
   buildCounterTargetHttpsProxy--;
 }
 
-buildUnnamed2409() {
+buildUnnamed2396() {
   var o = new core.List<api.TargetHttpsProxy>();
   o.add(buildTargetHttpsProxy());
   o.add(buildTargetHttpsProxy());
   return o;
 }
 
-checkUnnamed2409(core.List<api.TargetHttpsProxy> o) {
+checkUnnamed2396(core.List<api.TargetHttpsProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpsProxy(o[0]);
   checkTargetHttpsProxy(o[1]);
@@ -8230,7 +8270,7 @@
   buildCounterTargetHttpsProxyList++;
   if (buildCounterTargetHttpsProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2409();
+    o.items = buildUnnamed2396();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8243,7 +8283,7 @@
   buildCounterTargetHttpsProxyList++;
   if (buildCounterTargetHttpsProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2409(o.items);
+    checkUnnamed2396(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8286,14 +8326,14 @@
   buildCounterTargetInstance--;
 }
 
-buildUnnamed2410() {
+buildUnnamed2397() {
   var o = new core.Map<core.String, api.TargetInstancesScopedList>();
   o["x"] = buildTargetInstancesScopedList();
   o["y"] = buildTargetInstancesScopedList();
   return o;
 }
 
-checkUnnamed2410(core.Map<core.String, api.TargetInstancesScopedList> o) {
+checkUnnamed2397(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedList(o["x"]);
   checkTargetInstancesScopedList(o["y"]);
@@ -8305,7 +8345,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2410();
+    o.items = buildUnnamed2397();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8318,7 +8358,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2410(o.items);
+    checkUnnamed2397(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8326,14 +8366,14 @@
   buildCounterTargetInstanceAggregatedList--;
 }
 
-buildUnnamed2411() {
+buildUnnamed2398() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed2411(core.List<api.TargetInstance> o) {
+checkUnnamed2398(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -8345,7 +8385,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2411();
+    o.items = buildUnnamed2398();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8358,7 +8398,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2411(o.items);
+    checkUnnamed2398(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8366,14 +8406,14 @@
   buildCounterTargetInstanceList--;
 }
 
-buildUnnamed2412() {
+buildUnnamed2399() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed2412(core.List<api.TargetInstance> o) {
+checkUnnamed2399(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -8391,7 +8431,8 @@
   return o;
 }
 
-checkTargetInstancesScopedListWarningData(api.TargetInstancesScopedListWarningData o) {
+checkTargetInstancesScopedListWarningData(
+    api.TargetInstancesScopedListWarningData o) {
   buildCounterTargetInstancesScopedListWarningData++;
   if (buildCounterTargetInstancesScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -8400,14 +8441,14 @@
   buildCounterTargetInstancesScopedListWarningData--;
 }
 
-buildUnnamed2413() {
+buildUnnamed2400() {
   var o = new core.List<api.TargetInstancesScopedListWarningData>();
   o.add(buildTargetInstancesScopedListWarningData());
   o.add(buildTargetInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed2413(core.List<api.TargetInstancesScopedListWarningData> o) {
+checkUnnamed2400(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedListWarningData(o[0]);
   checkTargetInstancesScopedListWarningData(o[1]);
@@ -8419,7 +8460,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2413();
+    o.data = buildUnnamed2400();
     o.message = "foo";
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -8430,7 +8471,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2413(o.data);
+    checkUnnamed2400(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -8441,7 +8482,7 @@
   var o = new api.TargetInstancesScopedList();
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    o.targetInstances = buildUnnamed2412();
+    o.targetInstances = buildUnnamed2399();
     o.warning = buildTargetInstancesScopedListWarning();
   }
   buildCounterTargetInstancesScopedList--;
@@ -8451,33 +8492,33 @@
 checkTargetInstancesScopedList(api.TargetInstancesScopedList o) {
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    checkUnnamed2412(o.targetInstances);
+    checkUnnamed2399(o.targetInstances);
     checkTargetInstancesScopedListWarning(o.warning);
   }
   buildCounterTargetInstancesScopedList--;
 }
 
-buildUnnamed2414() {
+buildUnnamed2401() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2414(core.List<core.String> o) {
+checkUnnamed2401(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2415() {
+buildUnnamed2402() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2415(core.List<core.String> o) {
+checkUnnamed2402(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8492,9 +8533,9 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.failoverRatio = 42.0;
-    o.healthChecks = buildUnnamed2414();
+    o.healthChecks = buildUnnamed2401();
     o.id = "foo";
-    o.instances = buildUnnamed2415();
+    o.instances = buildUnnamed2402();
     o.kind = "foo";
     o.name = "foo";
     o.region = "foo";
@@ -8512,9 +8553,9 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.failoverRatio, unittest.equals(42.0));
-    checkUnnamed2414(o.healthChecks);
+    checkUnnamed2401(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2415(o.instances);
+    checkUnnamed2402(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -8524,14 +8565,14 @@
   buildCounterTargetPool--;
 }
 
-buildUnnamed2416() {
+buildUnnamed2403() {
   var o = new core.Map<core.String, api.TargetPoolsScopedList>();
   o["x"] = buildTargetPoolsScopedList();
   o["y"] = buildTargetPoolsScopedList();
   return o;
 }
 
-checkUnnamed2416(core.Map<core.String, api.TargetPoolsScopedList> o) {
+checkUnnamed2403(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedList(o["x"]);
   checkTargetPoolsScopedList(o["y"]);
@@ -8543,7 +8584,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2416();
+    o.items = buildUnnamed2403();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8556,7 +8597,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2416(o.items);
+    checkUnnamed2403(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8564,14 +8605,14 @@
   buildCounterTargetPoolAggregatedList--;
 }
 
-buildUnnamed2417() {
+buildUnnamed2404() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed2417(core.List<api.HealthStatus> o) {
+checkUnnamed2404(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -8582,7 +8623,7 @@
   var o = new api.TargetPoolInstanceHealth();
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    o.healthStatus = buildUnnamed2417();
+    o.healthStatus = buildUnnamed2404();
     o.kind = "foo";
   }
   buildCounterTargetPoolInstanceHealth--;
@@ -8592,20 +8633,20 @@
 checkTargetPoolInstanceHealth(api.TargetPoolInstanceHealth o) {
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    checkUnnamed2417(o.healthStatus);
+    checkUnnamed2404(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTargetPoolInstanceHealth--;
 }
 
-buildUnnamed2418() {
+buildUnnamed2405() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed2418(core.List<api.TargetPool> o) {
+checkUnnamed2405(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -8617,7 +8658,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2418();
+    o.items = buildUnnamed2405();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -8630,7 +8671,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2418(o.items);
+    checkUnnamed2405(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -8638,14 +8679,14 @@
   buildCounterTargetPoolList--;
 }
 
-buildUnnamed2419() {
+buildUnnamed2406() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed2419(core.List<api.HealthCheckReference> o) {
+checkUnnamed2406(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -8656,7 +8697,7 @@
   var o = new api.TargetPoolsAddHealthCheckRequest();
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed2419();
+    o.healthChecks = buildUnnamed2406();
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
   return o;
@@ -8665,19 +8706,19 @@
 checkTargetPoolsAddHealthCheckRequest(api.TargetPoolsAddHealthCheckRequest o) {
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    checkUnnamed2419(o.healthChecks);
+    checkUnnamed2406(o.healthChecks);
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
 }
 
-buildUnnamed2420() {
+buildUnnamed2407() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2420(core.List<api.InstanceReference> o) {
+checkUnnamed2407(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -8688,7 +8729,7 @@
   var o = new api.TargetPoolsAddInstanceRequest();
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    o.instances = buildUnnamed2420();
+    o.instances = buildUnnamed2407();
   }
   buildCounterTargetPoolsAddInstanceRequest--;
   return o;
@@ -8697,19 +8738,19 @@
 checkTargetPoolsAddInstanceRequest(api.TargetPoolsAddInstanceRequest o) {
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    checkUnnamed2420(o.instances);
+    checkUnnamed2407(o.instances);
   }
   buildCounterTargetPoolsAddInstanceRequest--;
 }
 
-buildUnnamed2421() {
+buildUnnamed2408() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed2421(core.List<api.HealthCheckReference> o) {
+checkUnnamed2408(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -8720,28 +8761,29 @@
   var o = new api.TargetPoolsRemoveHealthCheckRequest();
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed2421();
+    o.healthChecks = buildUnnamed2408();
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
   return o;
 }
 
-checkTargetPoolsRemoveHealthCheckRequest(api.TargetPoolsRemoveHealthCheckRequest o) {
+checkTargetPoolsRemoveHealthCheckRequest(
+    api.TargetPoolsRemoveHealthCheckRequest o) {
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    checkUnnamed2421(o.healthChecks);
+    checkUnnamed2408(o.healthChecks);
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
 }
 
-buildUnnamed2422() {
+buildUnnamed2409() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed2422(core.List<api.InstanceReference> o) {
+checkUnnamed2409(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -8752,7 +8794,7 @@
   var o = new api.TargetPoolsRemoveInstanceRequest();
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    o.instances = buildUnnamed2422();
+    o.instances = buildUnnamed2409();
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
   return o;
@@ -8761,19 +8803,19 @@
 checkTargetPoolsRemoveInstanceRequest(api.TargetPoolsRemoveInstanceRequest o) {
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    checkUnnamed2422(o.instances);
+    checkUnnamed2409(o.instances);
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
 }
 
-buildUnnamed2423() {
+buildUnnamed2410() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed2423(core.List<api.TargetPool> o) {
+checkUnnamed2410(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -8800,14 +8842,14 @@
   buildCounterTargetPoolsScopedListWarningData--;
 }
 
-buildUnnamed2424() {
+buildUnnamed2411() {
   var o = new core.List<api.TargetPoolsScopedListWarningData>();
   o.add(buildTargetPoolsScopedListWarningData());
   o.add(buildTargetPoolsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2424(core.List<api.TargetPoolsScopedListWarningData> o) {
+checkUnnamed2411(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedListWarningData(o[0]);
   checkTargetPoolsScopedListWarningData(o[1]);
@@ -8819,7 +8861,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2424();
+    o.data = buildUnnamed2411();
     o.message = "foo";
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -8830,7 +8872,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2424(o.data);
+    checkUnnamed2411(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -8841,7 +8883,7 @@
   var o = new api.TargetPoolsScopedList();
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    o.targetPools = buildUnnamed2423();
+    o.targetPools = buildUnnamed2410();
     o.warning = buildTargetPoolsScopedListWarning();
   }
   buildCounterTargetPoolsScopedList--;
@@ -8851,7 +8893,7 @@
 checkTargetPoolsScopedList(api.TargetPoolsScopedList o) {
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    checkUnnamed2423(o.targetPools);
+    checkUnnamed2410(o.targetPools);
     checkTargetPoolsScopedListWarning(o.warning);
   }
   buildCounterTargetPoolsScopedList--;
@@ -8887,7 +8929,8 @@
   return o;
 }
 
-checkTargetSslProxiesSetBackendServiceRequest(api.TargetSslProxiesSetBackendServiceRequest o) {
+checkTargetSslProxiesSetBackendServiceRequest(
+    api.TargetSslProxiesSetBackendServiceRequest o) {
   buildCounterTargetSslProxiesSetBackendServiceRequest++;
   if (buildCounterTargetSslProxiesSetBackendServiceRequest < 3) {
     unittest.expect(o.service, unittest.equals('foo'));
@@ -8906,7 +8949,8 @@
   return o;
 }
 
-checkTargetSslProxiesSetProxyHeaderRequest(api.TargetSslProxiesSetProxyHeaderRequest o) {
+checkTargetSslProxiesSetProxyHeaderRequest(
+    api.TargetSslProxiesSetProxyHeaderRequest o) {
   buildCounterTargetSslProxiesSetProxyHeaderRequest++;
   if (buildCounterTargetSslProxiesSetProxyHeaderRequest < 3) {
     unittest.expect(o.proxyHeader, unittest.equals('foo'));
@@ -8914,14 +8958,14 @@
   buildCounterTargetSslProxiesSetProxyHeaderRequest--;
 }
 
-buildUnnamed2425() {
+buildUnnamed2412() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2425(core.List<core.String> o) {
+checkUnnamed2412(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8932,28 +8976,29 @@
   var o = new api.TargetSslProxiesSetSslCertificatesRequest();
   buildCounterTargetSslProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetSslProxiesSetSslCertificatesRequest < 3) {
-    o.sslCertificates = buildUnnamed2425();
+    o.sslCertificates = buildUnnamed2412();
   }
   buildCounterTargetSslProxiesSetSslCertificatesRequest--;
   return o;
 }
 
-checkTargetSslProxiesSetSslCertificatesRequest(api.TargetSslProxiesSetSslCertificatesRequest o) {
+checkTargetSslProxiesSetSslCertificatesRequest(
+    api.TargetSslProxiesSetSslCertificatesRequest o) {
   buildCounterTargetSslProxiesSetSslCertificatesRequest++;
   if (buildCounterTargetSslProxiesSetSslCertificatesRequest < 3) {
-    checkUnnamed2425(o.sslCertificates);
+    checkUnnamed2412(o.sslCertificates);
   }
   buildCounterTargetSslProxiesSetSslCertificatesRequest--;
 }
 
-buildUnnamed2426() {
+buildUnnamed2413() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2426(core.List<core.String> o) {
+checkUnnamed2413(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -8972,7 +9017,7 @@
     o.proxyHeader = "foo";
     o.selfLink = "foo";
     o.service = "foo";
-    o.sslCertificates = buildUnnamed2426();
+    o.sslCertificates = buildUnnamed2413();
   }
   buildCounterTargetSslProxy--;
   return o;
@@ -8989,19 +9034,19 @@
     unittest.expect(o.proxyHeader, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.service, unittest.equals('foo'));
-    checkUnnamed2426(o.sslCertificates);
+    checkUnnamed2413(o.sslCertificates);
   }
   buildCounterTargetSslProxy--;
 }
 
-buildUnnamed2427() {
+buildUnnamed2414() {
   var o = new core.List<api.TargetSslProxy>();
   o.add(buildTargetSslProxy());
   o.add(buildTargetSslProxy());
   return o;
 }
 
-checkUnnamed2427(core.List<api.TargetSslProxy> o) {
+checkUnnamed2414(core.List<api.TargetSslProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetSslProxy(o[0]);
   checkTargetSslProxy(o[1]);
@@ -9013,7 +9058,7 @@
   buildCounterTargetSslProxyList++;
   if (buildCounterTargetSslProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2427();
+    o.items = buildUnnamed2414();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9026,7 +9071,7 @@
   buildCounterTargetSslProxyList++;
   if (buildCounterTargetSslProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2427(o.items);
+    checkUnnamed2414(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9045,7 +9090,8 @@
   return o;
 }
 
-checkTargetTcpProxiesSetBackendServiceRequest(api.TargetTcpProxiesSetBackendServiceRequest o) {
+checkTargetTcpProxiesSetBackendServiceRequest(
+    api.TargetTcpProxiesSetBackendServiceRequest o) {
   buildCounterTargetTcpProxiesSetBackendServiceRequest++;
   if (buildCounterTargetTcpProxiesSetBackendServiceRequest < 3) {
     unittest.expect(o.service, unittest.equals('foo'));
@@ -9064,7 +9110,8 @@
   return o;
 }
 
-checkTargetTcpProxiesSetProxyHeaderRequest(api.TargetTcpProxiesSetProxyHeaderRequest o) {
+checkTargetTcpProxiesSetProxyHeaderRequest(
+    api.TargetTcpProxiesSetProxyHeaderRequest o) {
   buildCounterTargetTcpProxiesSetProxyHeaderRequest++;
   if (buildCounterTargetTcpProxiesSetProxyHeaderRequest < 3) {
     unittest.expect(o.proxyHeader, unittest.equals('foo'));
@@ -9105,14 +9152,14 @@
   buildCounterTargetTcpProxy--;
 }
 
-buildUnnamed2428() {
+buildUnnamed2415() {
   var o = new core.List<api.TargetTcpProxy>();
   o.add(buildTargetTcpProxy());
   o.add(buildTargetTcpProxy());
   return o;
 }
 
-checkUnnamed2428(core.List<api.TargetTcpProxy> o) {
+checkUnnamed2415(core.List<api.TargetTcpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetTcpProxy(o[0]);
   checkTargetTcpProxy(o[1]);
@@ -9124,7 +9171,7 @@
   buildCounterTargetTcpProxyList++;
   if (buildCounterTargetTcpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2428();
+    o.items = buildUnnamed2415();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9137,7 +9184,7 @@
   buildCounterTargetTcpProxyList++;
   if (buildCounterTargetTcpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2428(o.items);
+    checkUnnamed2415(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9145,27 +9192,27 @@
   buildCounterTargetTcpProxyList--;
 }
 
-buildUnnamed2429() {
+buildUnnamed2416() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2429(core.List<core.String> o) {
+checkUnnamed2416(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2430() {
+buildUnnamed2417() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2430(core.List<core.String> o) {
+checkUnnamed2417(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9178,7 +9225,7 @@
   if (buildCounterTargetVpnGateway < 3) {
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.forwardingRules = buildUnnamed2429();
+    o.forwardingRules = buildUnnamed2416();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -9186,7 +9233,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.tunnels = buildUnnamed2430();
+    o.tunnels = buildUnnamed2417();
   }
   buildCounterTargetVpnGateway--;
   return o;
@@ -9197,7 +9244,7 @@
   if (buildCounterTargetVpnGateway < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2429(o.forwardingRules);
+    checkUnnamed2416(o.forwardingRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -9205,19 +9252,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed2430(o.tunnels);
+    checkUnnamed2417(o.tunnels);
   }
   buildCounterTargetVpnGateway--;
 }
 
-buildUnnamed2431() {
+buildUnnamed2418() {
   var o = new core.Map<core.String, api.TargetVpnGatewaysScopedList>();
   o["x"] = buildTargetVpnGatewaysScopedList();
   o["y"] = buildTargetVpnGatewaysScopedList();
   return o;
 }
 
-checkUnnamed2431(core.Map<core.String, api.TargetVpnGatewaysScopedList> o) {
+checkUnnamed2418(core.Map<core.String, api.TargetVpnGatewaysScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGatewaysScopedList(o["x"]);
   checkTargetVpnGatewaysScopedList(o["y"]);
@@ -9229,7 +9276,7 @@
   buildCounterTargetVpnGatewayAggregatedList++;
   if (buildCounterTargetVpnGatewayAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2431();
+    o.items = buildUnnamed2418();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9242,7 +9289,7 @@
   buildCounterTargetVpnGatewayAggregatedList++;
   if (buildCounterTargetVpnGatewayAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2431(o.items);
+    checkUnnamed2418(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9250,14 +9297,14 @@
   buildCounterTargetVpnGatewayAggregatedList--;
 }
 
-buildUnnamed2432() {
+buildUnnamed2419() {
   var o = new core.List<api.TargetVpnGateway>();
   o.add(buildTargetVpnGateway());
   o.add(buildTargetVpnGateway());
   return o;
 }
 
-checkUnnamed2432(core.List<api.TargetVpnGateway> o) {
+checkUnnamed2419(core.List<api.TargetVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGateway(o[0]);
   checkTargetVpnGateway(o[1]);
@@ -9269,7 +9316,7 @@
   buildCounterTargetVpnGatewayList++;
   if (buildCounterTargetVpnGatewayList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2432();
+    o.items = buildUnnamed2419();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9282,7 +9329,7 @@
   buildCounterTargetVpnGatewayList++;
   if (buildCounterTargetVpnGatewayList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2432(o.items);
+    checkUnnamed2419(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9290,14 +9337,14 @@
   buildCounterTargetVpnGatewayList--;
 }
 
-buildUnnamed2433() {
+buildUnnamed2420() {
   var o = new core.List<api.TargetVpnGateway>();
   o.add(buildTargetVpnGateway());
   o.add(buildTargetVpnGateway());
   return o;
 }
 
-checkUnnamed2433(core.List<api.TargetVpnGateway> o) {
+checkUnnamed2420(core.List<api.TargetVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGateway(o[0]);
   checkTargetVpnGateway(o[1]);
@@ -9315,7 +9362,8 @@
   return o;
 }
 
-checkTargetVpnGatewaysScopedListWarningData(api.TargetVpnGatewaysScopedListWarningData o) {
+checkTargetVpnGatewaysScopedListWarningData(
+    api.TargetVpnGatewaysScopedListWarningData o) {
   buildCounterTargetVpnGatewaysScopedListWarningData++;
   if (buildCounterTargetVpnGatewaysScopedListWarningData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
@@ -9324,14 +9372,14 @@
   buildCounterTargetVpnGatewaysScopedListWarningData--;
 }
 
-buildUnnamed2434() {
+buildUnnamed2421() {
   var o = new core.List<api.TargetVpnGatewaysScopedListWarningData>();
   o.add(buildTargetVpnGatewaysScopedListWarningData());
   o.add(buildTargetVpnGatewaysScopedListWarningData());
   return o;
 }
 
-checkUnnamed2434(core.List<api.TargetVpnGatewaysScopedListWarningData> o) {
+checkUnnamed2421(core.List<api.TargetVpnGatewaysScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetVpnGatewaysScopedListWarningData(o[0]);
   checkTargetVpnGatewaysScopedListWarningData(o[1]);
@@ -9343,18 +9391,19 @@
   buildCounterTargetVpnGatewaysScopedListWarning++;
   if (buildCounterTargetVpnGatewaysScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2434();
+    o.data = buildUnnamed2421();
     o.message = "foo";
   }
   buildCounterTargetVpnGatewaysScopedListWarning--;
   return o;
 }
 
-checkTargetVpnGatewaysScopedListWarning(api.TargetVpnGatewaysScopedListWarning o) {
+checkTargetVpnGatewaysScopedListWarning(
+    api.TargetVpnGatewaysScopedListWarning o) {
   buildCounterTargetVpnGatewaysScopedListWarning++;
   if (buildCounterTargetVpnGatewaysScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2434(o.data);
+    checkUnnamed2421(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetVpnGatewaysScopedListWarning--;
@@ -9365,7 +9414,7 @@
   var o = new api.TargetVpnGatewaysScopedList();
   buildCounterTargetVpnGatewaysScopedList++;
   if (buildCounterTargetVpnGatewaysScopedList < 3) {
-    o.targetVpnGateways = buildUnnamed2433();
+    o.targetVpnGateways = buildUnnamed2420();
     o.warning = buildTargetVpnGatewaysScopedListWarning();
   }
   buildCounterTargetVpnGatewaysScopedList--;
@@ -9375,7 +9424,7 @@
 checkTargetVpnGatewaysScopedList(api.TargetVpnGatewaysScopedList o) {
   buildCounterTargetVpnGatewaysScopedList++;
   if (buildCounterTargetVpnGatewaysScopedList < 3) {
-    checkUnnamed2433(o.targetVpnGateways);
+    checkUnnamed2420(o.targetVpnGateways);
     checkTargetVpnGatewaysScopedListWarning(o.warning);
   }
   buildCounterTargetVpnGatewaysScopedList--;
@@ -9406,40 +9455,40 @@
   buildCounterTestFailure--;
 }
 
-buildUnnamed2435() {
+buildUnnamed2422() {
   var o = new core.List<api.HostRule>();
   o.add(buildHostRule());
   o.add(buildHostRule());
   return o;
 }
 
-checkUnnamed2435(core.List<api.HostRule> o) {
+checkUnnamed2422(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHostRule(o[0]);
   checkHostRule(o[1]);
 }
 
-buildUnnamed2436() {
+buildUnnamed2423() {
   var o = new core.List<api.PathMatcher>();
   o.add(buildPathMatcher());
   o.add(buildPathMatcher());
   return o;
 }
 
-checkUnnamed2436(core.List<api.PathMatcher> o) {
+checkUnnamed2423(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathMatcher(o[0]);
   checkPathMatcher(o[1]);
 }
 
-buildUnnamed2437() {
+buildUnnamed2424() {
   var o = new core.List<api.UrlMapTest>();
   o.add(buildUrlMapTest());
   o.add(buildUrlMapTest());
   return o;
 }
 
-checkUnnamed2437(core.List<api.UrlMapTest> o) {
+checkUnnamed2424(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapTest(o[0]);
   checkUrlMapTest(o[1]);
@@ -9454,13 +9503,13 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.hostRules = buildUnnamed2435();
+    o.hostRules = buildUnnamed2422();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.pathMatchers = buildUnnamed2436();
+    o.pathMatchers = buildUnnamed2423();
     o.selfLink = "foo";
-    o.tests = buildUnnamed2437();
+    o.tests = buildUnnamed2424();
   }
   buildCounterUrlMap--;
   return o;
@@ -9473,25 +9522,25 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed2435(o.hostRules);
+    checkUnnamed2422(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2436(o.pathMatchers);
+    checkUnnamed2423(o.pathMatchers);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed2437(o.tests);
+    checkUnnamed2424(o.tests);
   }
   buildCounterUrlMap--;
 }
 
-buildUnnamed2438() {
+buildUnnamed2425() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed2438(core.List<api.UrlMap> o) {
+checkUnnamed2425(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
@@ -9503,7 +9552,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2438();
+    o.items = buildUnnamed2425();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9516,7 +9565,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2438(o.items);
+    checkUnnamed2425(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9568,27 +9617,27 @@
   buildCounterUrlMapTest--;
 }
 
-buildUnnamed2439() {
+buildUnnamed2426() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2439(core.List<core.String> o) {
+checkUnnamed2426(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2440() {
+buildUnnamed2427() {
   var o = new core.List<api.TestFailure>();
   o.add(buildTestFailure());
   o.add(buildTestFailure());
   return o;
 }
 
-checkUnnamed2440(core.List<api.TestFailure> o) {
+checkUnnamed2427(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestFailure(o[0]);
   checkTestFailure(o[1]);
@@ -9599,9 +9648,9 @@
   var o = new api.UrlMapValidationResult();
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    o.loadErrors = buildUnnamed2439();
+    o.loadErrors = buildUnnamed2426();
     o.loadSucceeded = true;
-    o.testFailures = buildUnnamed2440();
+    o.testFailures = buildUnnamed2427();
     o.testPassed = true;
   }
   buildCounterUrlMapValidationResult--;
@@ -9611,9 +9660,9 @@
 checkUrlMapValidationResult(api.UrlMapValidationResult o) {
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    checkUnnamed2439(o.loadErrors);
+    checkUnnamed2426(o.loadErrors);
     unittest.expect(o.loadSucceeded, unittest.isTrue);
-    checkUnnamed2440(o.testFailures);
+    checkUnnamed2427(o.testFailures);
     unittest.expect(o.testPassed, unittest.isTrue);
   }
   buildCounterUrlMapValidationResult--;
@@ -9678,27 +9727,27 @@
   buildCounterUsageExportLocation--;
 }
 
-buildUnnamed2441() {
+buildUnnamed2428() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2441(core.List<core.String> o) {
+checkUnnamed2428(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2442() {
+buildUnnamed2429() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2442(core.List<core.String> o) {
+checkUnnamed2429(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -9715,11 +9764,11 @@
     o.id = "foo";
     o.ikeVersion = 42;
     o.kind = "foo";
-    o.localTrafficSelector = buildUnnamed2441();
+    o.localTrafficSelector = buildUnnamed2428();
     o.name = "foo";
     o.peerIp = "foo";
     o.region = "foo";
-    o.remoteTrafficSelector = buildUnnamed2442();
+    o.remoteTrafficSelector = buildUnnamed2429();
     o.router = "foo";
     o.selfLink = "foo";
     o.sharedSecret = "foo";
@@ -9740,11 +9789,11 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.ikeVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2441(o.localTrafficSelector);
+    checkUnnamed2428(o.localTrafficSelector);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.peerIp, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed2442(o.remoteTrafficSelector);
+    checkUnnamed2429(o.remoteTrafficSelector);
     unittest.expect(o.router, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sharedSecret, unittest.equals('foo'));
@@ -9755,14 +9804,14 @@
   buildCounterVpnTunnel--;
 }
 
-buildUnnamed2443() {
+buildUnnamed2430() {
   var o = new core.Map<core.String, api.VpnTunnelsScopedList>();
   o["x"] = buildVpnTunnelsScopedList();
   o["y"] = buildVpnTunnelsScopedList();
   return o;
 }
 
-checkUnnamed2443(core.Map<core.String, api.VpnTunnelsScopedList> o) {
+checkUnnamed2430(core.Map<core.String, api.VpnTunnelsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnelsScopedList(o["x"]);
   checkVpnTunnelsScopedList(o["y"]);
@@ -9774,7 +9823,7 @@
   buildCounterVpnTunnelAggregatedList++;
   if (buildCounterVpnTunnelAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2443();
+    o.items = buildUnnamed2430();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9787,7 +9836,7 @@
   buildCounterVpnTunnelAggregatedList++;
   if (buildCounterVpnTunnelAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2443(o.items);
+    checkUnnamed2430(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9795,14 +9844,14 @@
   buildCounterVpnTunnelAggregatedList--;
 }
 
-buildUnnamed2444() {
+buildUnnamed2431() {
   var o = new core.List<api.VpnTunnel>();
   o.add(buildVpnTunnel());
   o.add(buildVpnTunnel());
   return o;
 }
 
-checkUnnamed2444(core.List<api.VpnTunnel> o) {
+checkUnnamed2431(core.List<api.VpnTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnel(o[0]);
   checkVpnTunnel(o[1]);
@@ -9814,7 +9863,7 @@
   buildCounterVpnTunnelList++;
   if (buildCounterVpnTunnelList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2444();
+    o.items = buildUnnamed2431();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9827,7 +9876,7 @@
   buildCounterVpnTunnelList++;
   if (buildCounterVpnTunnelList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2444(o.items);
+    checkUnnamed2431(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -9835,14 +9884,14 @@
   buildCounterVpnTunnelList--;
 }
 
-buildUnnamed2445() {
+buildUnnamed2432() {
   var o = new core.List<api.VpnTunnel>();
   o.add(buildVpnTunnel());
   o.add(buildVpnTunnel());
   return o;
 }
 
-checkUnnamed2445(core.List<api.VpnTunnel> o) {
+checkUnnamed2432(core.List<api.VpnTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnel(o[0]);
   checkVpnTunnel(o[1]);
@@ -9869,14 +9918,14 @@
   buildCounterVpnTunnelsScopedListWarningData--;
 }
 
-buildUnnamed2446() {
+buildUnnamed2433() {
   var o = new core.List<api.VpnTunnelsScopedListWarningData>();
   o.add(buildVpnTunnelsScopedListWarningData());
   o.add(buildVpnTunnelsScopedListWarningData());
   return o;
 }
 
-checkUnnamed2446(core.List<api.VpnTunnelsScopedListWarningData> o) {
+checkUnnamed2433(core.List<api.VpnTunnelsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVpnTunnelsScopedListWarningData(o[0]);
   checkVpnTunnelsScopedListWarningData(o[1]);
@@ -9888,7 +9937,7 @@
   buildCounterVpnTunnelsScopedListWarning++;
   if (buildCounterVpnTunnelsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2446();
+    o.data = buildUnnamed2433();
     o.message = "foo";
   }
   buildCounterVpnTunnelsScopedListWarning--;
@@ -9899,7 +9948,7 @@
   buildCounterVpnTunnelsScopedListWarning++;
   if (buildCounterVpnTunnelsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2446(o.data);
+    checkUnnamed2433(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterVpnTunnelsScopedListWarning--;
@@ -9910,7 +9959,7 @@
   var o = new api.VpnTunnelsScopedList();
   buildCounterVpnTunnelsScopedList++;
   if (buildCounterVpnTunnelsScopedList < 3) {
-    o.vpnTunnels = buildUnnamed2445();
+    o.vpnTunnels = buildUnnamed2432();
     o.warning = buildVpnTunnelsScopedListWarning();
   }
   buildCounterVpnTunnelsScopedList--;
@@ -9920,20 +9969,20 @@
 checkVpnTunnelsScopedList(api.VpnTunnelsScopedList o) {
   buildCounterVpnTunnelsScopedList++;
   if (buildCounterVpnTunnelsScopedList < 3) {
-    checkUnnamed2445(o.vpnTunnels);
+    checkUnnamed2432(o.vpnTunnels);
     checkVpnTunnelsScopedListWarning(o.warning);
   }
   buildCounterVpnTunnelsScopedList--;
 }
 
-buildUnnamed2447() {
+buildUnnamed2434() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed2447(core.List<api.Project> o) {
+checkUnnamed2434(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -9945,7 +9994,7 @@
   buildCounterXpnHostList++;
   if (buildCounterXpnHostList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2447();
+    o.items = buildUnnamed2434();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -9958,7 +10007,7 @@
   buildCounterXpnHostList++;
   if (buildCounterXpnHostList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2447(o.items);
+    checkUnnamed2434(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10022,14 +10071,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed2448() {
+buildUnnamed2435() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed2448(core.List<api.Zone> o) {
+checkUnnamed2435(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -10041,7 +10090,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed2448();
+    o.items = buildUnnamed2435();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -10054,7 +10103,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2448(o.items);
+    checkUnnamed2435(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10062,14 +10111,14 @@
   buildCounterZoneList--;
 }
 
-buildUnnamed2449() {
+buildUnnamed2436() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2449(core.Map<core.String, core.String> o) {
+checkUnnamed2436(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -10081,7 +10130,7 @@
   buildCounterZoneSetLabelsRequest++;
   if (buildCounterZoneSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.labels = buildUnnamed2449();
+    o.labels = buildUnnamed2436();
   }
   buildCounterZoneSetLabelsRequest--;
   return o;
@@ -10091,12 +10140,11 @@
   buildCounterZoneSetLabelsRequest++;
   if (buildCounterZoneSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed2449(o.labels);
+    checkUnnamed2436(o.labels);
   }
   buildCounterZoneSetLabelsRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AcceleratorConfig", () {
     unittest.test("to-json--from-json", () {
@@ -10106,7 +10154,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AcceleratorType", () {
     unittest.test("to-json--from-json", () {
       var o = buildAcceleratorType();
@@ -10115,7 +10162,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AcceleratorTypeAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAcceleratorTypeAggregatedList();
@@ -10124,7 +10170,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AcceleratorTypeList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAcceleratorTypeList();
@@ -10133,16 +10178,15 @@
     });
   });
 
-
   unittest.group("obj-schema-AcceleratorTypesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildAcceleratorTypesScopedListWarningData();
-      var od = new api.AcceleratorTypesScopedListWarningData.fromJson(o.toJson());
+      var od =
+          new api.AcceleratorTypesScopedListWarningData.fromJson(o.toJson());
       checkAcceleratorTypesScopedListWarningData(od);
     });
   });
 
-
   unittest.group("obj-schema-AcceleratorTypesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildAcceleratorTypesScopedListWarning();
@@ -10151,7 +10195,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AcceleratorTypesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAcceleratorTypesScopedList();
@@ -10160,7 +10203,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AccessConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAccessConfig();
@@ -10169,7 +10211,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Address", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddress();
@@ -10178,7 +10219,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AddressAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddressAggregatedList();
@@ -10187,7 +10227,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AddressList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddressList();
@@ -10196,7 +10235,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AddressesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddressesScopedListWarningData();
@@ -10205,7 +10243,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AddressesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddressesScopedListWarning();
@@ -10214,7 +10251,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AddressesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddressesScopedList();
@@ -10223,7 +10259,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AliasIpRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildAliasIpRange();
@@ -10232,7 +10267,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AttachedDisk", () {
     unittest.test("to-json--from-json", () {
       var o = buildAttachedDisk();
@@ -10241,7 +10275,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AttachedDiskInitializeParams", () {
     unittest.test("to-json--from-json", () {
       var o = buildAttachedDiskInitializeParams();
@@ -10250,7 +10283,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Autoscaler", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscaler();
@@ -10259,7 +10291,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalerAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalerAggregatedList();
@@ -10268,7 +10299,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalerList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalerList();
@@ -10277,7 +10307,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalerStatusDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalerStatusDetails();
@@ -10286,7 +10315,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalersScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalersScopedListWarningData();
@@ -10295,7 +10323,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalersScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalersScopedListWarning();
@@ -10304,7 +10331,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalersScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalersScopedList();
@@ -10313,7 +10339,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalingPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalingPolicy();
@@ -10322,7 +10347,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalingPolicyCpuUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalingPolicyCpuUtilization();
@@ -10331,25 +10355,24 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoscalingPolicyCustomMetricUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalingPolicyCustomMetricUtilization();
-      var od = new api.AutoscalingPolicyCustomMetricUtilization.fromJson(o.toJson());
+      var od =
+          new api.AutoscalingPolicyCustomMetricUtilization.fromJson(o.toJson());
       checkAutoscalingPolicyCustomMetricUtilization(od);
     });
   });
 
-
   unittest.group("obj-schema-AutoscalingPolicyLoadBalancingUtilization", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoscalingPolicyLoadBalancingUtilization();
-      var od = new api.AutoscalingPolicyLoadBalancingUtilization.fromJson(o.toJson());
+      var od = new api.AutoscalingPolicyLoadBalancingUtilization.fromJson(
+          o.toJson());
       checkAutoscalingPolicyLoadBalancingUtilization(od);
     });
   });
 
-
   unittest.group("obj-schema-Backend", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackend();
@@ -10358,7 +10381,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendBucket", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendBucket();
@@ -10367,7 +10389,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendBucketList", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendBucketList();
@@ -10376,7 +10397,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendService", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendService();
@@ -10385,7 +10405,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServiceAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServiceAggregatedList();
@@ -10394,7 +10413,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServiceCdnPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServiceCdnPolicy();
@@ -10403,7 +10421,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServiceGroupHealth", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServiceGroupHealth();
@@ -10412,7 +10429,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServiceIAP", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServiceIAP();
@@ -10421,7 +10437,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServiceList", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServiceList();
@@ -10430,16 +10445,15 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServicesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServicesScopedListWarningData();
-      var od = new api.BackendServicesScopedListWarningData.fromJson(o.toJson());
+      var od =
+          new api.BackendServicesScopedListWarningData.fromJson(o.toJson());
       checkBackendServicesScopedListWarningData(od);
     });
   });
 
-
   unittest.group("obj-schema-BackendServicesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServicesScopedListWarning();
@@ -10448,7 +10462,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendServicesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendServicesScopedList();
@@ -10457,7 +10470,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CacheInvalidationRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildCacheInvalidationRule();
@@ -10466,7 +10478,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CacheKeyPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildCacheKeyPolicy();
@@ -10475,7 +10486,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Commitment", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitment();
@@ -10484,7 +10494,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitmentAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitmentAggregatedList();
@@ -10493,7 +10502,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitmentList", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitmentList();
@@ -10502,7 +10510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitmentsScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitmentsScopedListWarningData();
@@ -10511,7 +10518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitmentsScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitmentsScopedListWarning();
@@ -10520,7 +10526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitmentsScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitmentsScopedList();
@@ -10529,7 +10534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConnectionDraining", () {
     unittest.test("to-json--from-json", () {
       var o = buildConnectionDraining();
@@ -10538,7 +10542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomerEncryptionKey", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomerEncryptionKey();
@@ -10547,7 +10550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomerEncryptionKeyProtectedDisk", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomerEncryptionKeyProtectedDisk();
@@ -10556,7 +10558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeprecationStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeprecationStatus();
@@ -10565,7 +10566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Disk", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisk();
@@ -10574,7 +10574,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskAggregatedList();
@@ -10583,7 +10582,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskList();
@@ -10592,7 +10590,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskMoveRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskMoveRequest();
@@ -10601,7 +10598,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskType", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskType();
@@ -10610,7 +10606,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskTypeAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskTypeAggregatedList();
@@ -10619,7 +10614,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskTypeList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskTypeList();
@@ -10628,7 +10622,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskTypesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskTypesScopedListWarningData();
@@ -10637,7 +10630,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskTypesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskTypesScopedListWarning();
@@ -10646,7 +10638,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskTypesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskTypesScopedList();
@@ -10655,7 +10646,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DisksResizeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisksResizeRequest();
@@ -10664,7 +10654,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DisksScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisksScopedListWarningData();
@@ -10673,7 +10662,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DisksScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisksScopedListWarning();
@@ -10682,7 +10670,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DisksScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisksScopedList();
@@ -10691,7 +10678,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FirewallAllowed", () {
     unittest.test("to-json--from-json", () {
       var o = buildFirewallAllowed();
@@ -10700,7 +10686,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FirewallDenied", () {
     unittest.test("to-json--from-json", () {
       var o = buildFirewallDenied();
@@ -10709,7 +10694,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Firewall", () {
     unittest.test("to-json--from-json", () {
       var o = buildFirewall();
@@ -10718,7 +10702,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FirewallList", () {
     unittest.test("to-json--from-json", () {
       var o = buildFirewallList();
@@ -10727,7 +10710,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ForwardingRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildForwardingRule();
@@ -10736,7 +10718,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ForwardingRuleAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildForwardingRuleAggregatedList();
@@ -10745,7 +10726,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ForwardingRuleList", () {
     unittest.test("to-json--from-json", () {
       var o = buildForwardingRuleList();
@@ -10754,16 +10734,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ForwardingRulesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildForwardingRulesScopedListWarningData();
-      var od = new api.ForwardingRulesScopedListWarningData.fromJson(o.toJson());
+      var od =
+          new api.ForwardingRulesScopedListWarningData.fromJson(o.toJson());
       checkForwardingRulesScopedListWarningData(od);
     });
   });
 
-
   unittest.group("obj-schema-ForwardingRulesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildForwardingRulesScopedListWarning();
@@ -10772,7 +10751,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ForwardingRulesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildForwardingRulesScopedList();
@@ -10781,7 +10759,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GlobalSetLabelsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGlobalSetLabelsRequest();
@@ -10790,7 +10767,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GuestOsFeature", () {
     unittest.test("to-json--from-json", () {
       var o = buildGuestOsFeature();
@@ -10799,7 +10775,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HTTPHealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildHTTPHealthCheck();
@@ -10808,7 +10783,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HTTPSHealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildHTTPSHealthCheck();
@@ -10817,7 +10791,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildHealthCheck();
@@ -10826,7 +10799,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HealthCheckList", () {
     unittest.test("to-json--from-json", () {
       var o = buildHealthCheckList();
@@ -10835,7 +10807,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HealthCheckReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildHealthCheckReference();
@@ -10844,7 +10815,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HealthStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildHealthStatus();
@@ -10853,7 +10823,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HostRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildHostRule();
@@ -10862,7 +10831,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpHealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpHealthCheck();
@@ -10871,7 +10839,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpHealthCheckList", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpHealthCheckList();
@@ -10880,7 +10847,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpsHealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpsHealthCheck();
@@ -10889,7 +10855,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpsHealthCheckList", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpsHealthCheckList();
@@ -10898,7 +10863,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageRawDisk", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageRawDisk();
@@ -10907,7 +10871,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Image", () {
     unittest.test("to-json--from-json", () {
       var o = buildImage();
@@ -10916,7 +10879,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageList", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageList();
@@ -10925,7 +10887,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Instance", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstance();
@@ -10934,7 +10895,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceAggregatedList();
@@ -10943,7 +10903,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroup", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroup();
@@ -10952,7 +10911,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupAggregatedList();
@@ -10961,7 +10919,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupList();
@@ -10970,7 +10927,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManager", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManager();
@@ -10979,7 +10935,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagerActionsSummary", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagerActionsSummary();
@@ -10988,7 +10943,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagerAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagerAggregatedList();
@@ -10997,7 +10951,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagerList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagerList();
@@ -11006,61 +10959,63 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagersAbandonInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersAbandonInstancesRequest();
-      var od = new api.InstanceGroupManagersAbandonInstancesRequest.fromJson(o.toJson());
+      var od = new api.InstanceGroupManagersAbandonInstancesRequest.fromJson(
+          o.toJson());
       checkInstanceGroupManagersAbandonInstancesRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagersDeleteInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersDeleteInstancesRequest();
-      var od = new api.InstanceGroupManagersDeleteInstancesRequest.fromJson(o.toJson());
+      var od = new api.InstanceGroupManagersDeleteInstancesRequest.fromJson(
+          o.toJson());
       checkInstanceGroupManagersDeleteInstancesRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-InstanceGroupManagersListManagedInstancesResponse", () {
+  unittest.group("obj-schema-InstanceGroupManagersListManagedInstancesResponse",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersListManagedInstancesResponse();
-      var od = new api.InstanceGroupManagersListManagedInstancesResponse.fromJson(o.toJson());
+      var od =
+          new api.InstanceGroupManagersListManagedInstancesResponse.fromJson(
+              o.toJson());
       checkInstanceGroupManagersListManagedInstancesResponse(od);
     });
   });
 
-
-  unittest.group("obj-schema-InstanceGroupManagersRecreateInstancesRequest", () {
+  unittest.group("obj-schema-InstanceGroupManagersRecreateInstancesRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersRecreateInstancesRequest();
-      var od = new api.InstanceGroupManagersRecreateInstancesRequest.fromJson(o.toJson());
+      var od = new api.InstanceGroupManagersRecreateInstancesRequest.fromJson(
+          o.toJson());
       checkInstanceGroupManagersRecreateInstancesRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagersScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersScopedListWarningData();
-      var od = new api.InstanceGroupManagersScopedListWarningData.fromJson(o.toJson());
+      var od = new api.InstanceGroupManagersScopedListWarningData.fromJson(
+          o.toJson());
       checkInstanceGroupManagersScopedListWarningData(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagersScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersScopedListWarning();
-      var od = new api.InstanceGroupManagersScopedListWarning.fromJson(o.toJson());
+      var od =
+          new api.InstanceGroupManagersScopedListWarning.fromJson(o.toJson());
       checkInstanceGroupManagersScopedListWarning(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagersScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersScopedList();
@@ -11069,25 +11024,25 @@
     });
   });
 
-
-  unittest.group("obj-schema-InstanceGroupManagersSetInstanceTemplateRequest", () {
+  unittest.group("obj-schema-InstanceGroupManagersSetInstanceTemplateRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersSetInstanceTemplateRequest();
-      var od = new api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(o.toJson());
+      var od = new api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(
+          o.toJson());
       checkInstanceGroupManagersSetInstanceTemplateRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupManagersSetTargetPoolsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupManagersSetTargetPoolsRequest();
-      var od = new api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(o.toJson());
+      var od = new api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(
+          o.toJson());
       checkInstanceGroupManagersSetTargetPoolsRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsAddInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsAddInstancesRequest();
@@ -11096,7 +11051,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsListInstances", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsListInstances();
@@ -11105,7 +11059,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsListInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsListInstancesRequest();
@@ -11114,16 +11067,15 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsRemoveInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsRemoveInstancesRequest();
-      var od = new api.InstanceGroupsRemoveInstancesRequest.fromJson(o.toJson());
+      var od =
+          new api.InstanceGroupsRemoveInstancesRequest.fromJson(o.toJson());
       checkInstanceGroupsRemoveInstancesRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsScopedListWarningData();
@@ -11132,7 +11084,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsScopedListWarning();
@@ -11141,7 +11092,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsScopedList();
@@ -11150,7 +11100,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupsSetNamedPortsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupsSetNamedPortsRequest();
@@ -11159,7 +11108,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceList();
@@ -11168,7 +11116,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceMoveRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceMoveRequest();
@@ -11177,7 +11124,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceProperties();
@@ -11186,7 +11132,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceReference();
@@ -11195,7 +11140,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceTemplate", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceTemplate();
@@ -11204,7 +11148,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceTemplateList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceTemplateList();
@@ -11213,7 +11156,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceWithNamedPorts", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceWithNamedPorts();
@@ -11222,7 +11164,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesScopedListWarningData();
@@ -11231,7 +11172,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesScopedListWarning();
@@ -11240,7 +11180,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesScopedList();
@@ -11249,7 +11188,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesSetLabelsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesSetLabelsRequest();
@@ -11258,7 +11196,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesSetMachineResourcesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesSetMachineResourcesRequest();
@@ -11267,7 +11204,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesSetMachineTypeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesSetMachineTypeRequest();
@@ -11276,7 +11212,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesSetServiceAccountRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesSetServiceAccountRequest();
@@ -11285,16 +11220,15 @@
     });
   });
 
-
   unittest.group("obj-schema-InstancesStartWithEncryptionKeyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstancesStartWithEncryptionKeyRequest();
-      var od = new api.InstancesStartWithEncryptionKeyRequest.fromJson(o.toJson());
+      var od =
+          new api.InstancesStartWithEncryptionKeyRequest.fromJson(o.toJson());
       checkInstancesStartWithEncryptionKeyRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-License", () {
     unittest.test("to-json--from-json", () {
       var o = buildLicense();
@@ -11303,7 +11237,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineTypeScratchDisks", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineTypeScratchDisks();
@@ -11312,7 +11245,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineType", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineType();
@@ -11321,7 +11253,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineTypeAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineTypeAggregatedList();
@@ -11330,7 +11261,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineTypeList", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineTypeList();
@@ -11339,7 +11269,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineTypesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineTypesScopedListWarningData();
@@ -11348,7 +11277,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineTypesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineTypesScopedListWarning();
@@ -11357,7 +11285,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MachineTypesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildMachineTypesScopedList();
@@ -11366,7 +11293,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedInstance", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedInstance();
@@ -11375,16 +11301,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedInstanceLastAttemptErrorsErrors", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedInstanceLastAttemptErrorsErrors();
-      var od = new api.ManagedInstanceLastAttemptErrorsErrors.fromJson(o.toJson());
+      var od =
+          new api.ManagedInstanceLastAttemptErrorsErrors.fromJson(o.toJson());
       checkManagedInstanceLastAttemptErrorsErrors(od);
     });
   });
 
-
   unittest.group("obj-schema-ManagedInstanceLastAttemptErrors", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedInstanceLastAttemptErrors();
@@ -11393,7 +11318,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedInstanceLastAttempt", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedInstanceLastAttempt();
@@ -11402,7 +11326,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetadataItems", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetadataItems();
@@ -11411,7 +11334,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Metadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetadata();
@@ -11420,7 +11342,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NamedPort", () {
     unittest.test("to-json--from-json", () {
       var o = buildNamedPort();
@@ -11429,7 +11350,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Network", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetwork();
@@ -11438,7 +11358,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkInterface", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkInterface();
@@ -11447,7 +11366,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkList", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkList();
@@ -11456,7 +11374,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkPeering", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkPeering();
@@ -11465,7 +11382,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworksAddPeeringRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworksAddPeeringRequest();
@@ -11474,7 +11390,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworksRemovePeeringRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworksRemovePeeringRequest();
@@ -11483,7 +11398,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationErrorErrors", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationErrorErrors();
@@ -11492,7 +11406,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationError", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationError();
@@ -11501,7 +11414,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationWarningsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationWarningsData();
@@ -11510,7 +11422,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationWarnings", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationWarnings();
@@ -11519,7 +11430,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -11528,7 +11438,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationAggregatedList();
@@ -11537,7 +11446,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationList", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationList();
@@ -11546,7 +11454,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationsScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationsScopedListWarningData();
@@ -11555,7 +11462,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationsScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationsScopedListWarning();
@@ -11564,7 +11470,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationsScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationsScopedList();
@@ -11573,7 +11478,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PathMatcher", () {
     unittest.test("to-json--from-json", () {
       var o = buildPathMatcher();
@@ -11582,7 +11486,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PathRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildPathRule();
@@ -11591,7 +11494,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Project", () {
     unittest.test("to-json--from-json", () {
       var o = buildProject();
@@ -11600,7 +11502,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectsDisableXpnResourceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectsDisableXpnResourceRequest();
@@ -11609,7 +11510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectsEnableXpnResourceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectsEnableXpnResourceRequest();
@@ -11618,7 +11518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectsGetXpnResources", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectsGetXpnResources();
@@ -11627,7 +11526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProjectsListXpnHostsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjectsListXpnHostsRequest();
@@ -11636,7 +11534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Quota", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuota();
@@ -11645,7 +11542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Region", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegion();
@@ -11654,7 +11550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RegionAutoscalerList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionAutoscalerList();
@@ -11663,7 +11558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RegionInstanceGroupList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupList();
@@ -11672,7 +11566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RegionInstanceGroupManagerList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagerList();
@@ -11681,61 +11574,69 @@
     });
   });
 
-
-  unittest.group("obj-schema-RegionInstanceGroupManagersAbandonInstancesRequest", () {
+  unittest.group(
+      "obj-schema-RegionInstanceGroupManagersAbandonInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagersAbandonInstancesRequest();
-      var od = new api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(o.toJson());
+      var od =
+          new api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(
+              o.toJson());
       checkRegionInstanceGroupManagersAbandonInstancesRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-RegionInstanceGroupManagersDeleteInstancesRequest", () {
+  unittest.group("obj-schema-RegionInstanceGroupManagersDeleteInstancesRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagersDeleteInstancesRequest();
-      var od = new api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(o.toJson());
+      var od =
+          new api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(
+              o.toJson());
       checkRegionInstanceGroupManagersDeleteInstancesRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-RegionInstanceGroupManagersListInstancesResponse", () {
+  unittest.group("obj-schema-RegionInstanceGroupManagersListInstancesResponse",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagersListInstancesResponse();
-      var od = new api.RegionInstanceGroupManagersListInstancesResponse.fromJson(o.toJson());
+      var od =
+          new api.RegionInstanceGroupManagersListInstancesResponse.fromJson(
+              o.toJson());
       checkRegionInstanceGroupManagersListInstancesResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-RegionInstanceGroupManagersRecreateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagersRecreateRequest();
-      var od = new api.RegionInstanceGroupManagersRecreateRequest.fromJson(o.toJson());
+      var od = new api.RegionInstanceGroupManagersRecreateRequest.fromJson(
+          o.toJson());
       checkRegionInstanceGroupManagersRecreateRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-RegionInstanceGroupManagersSetTargetPoolsRequest", () {
+  unittest.group("obj-schema-RegionInstanceGroupManagersSetTargetPoolsRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagersSetTargetPoolsRequest();
-      var od = new api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(o.toJson());
+      var od =
+          new api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(
+              o.toJson());
       checkRegionInstanceGroupManagersSetTargetPoolsRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-RegionInstanceGroupManagersSetTemplateRequest", () {
+  unittest.group("obj-schema-RegionInstanceGroupManagersSetTemplateRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupManagersSetTemplateRequest();
-      var od = new api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(o.toJson());
+      var od = new api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(
+          o.toJson());
       checkRegionInstanceGroupManagersSetTemplateRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-RegionInstanceGroupsListInstances", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupsListInstances();
@@ -11744,25 +11645,24 @@
     });
   });
 
-
   unittest.group("obj-schema-RegionInstanceGroupsListInstancesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupsListInstancesRequest();
-      var od = new api.RegionInstanceGroupsListInstancesRequest.fromJson(o.toJson());
+      var od =
+          new api.RegionInstanceGroupsListInstancesRequest.fromJson(o.toJson());
       checkRegionInstanceGroupsListInstancesRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-RegionInstanceGroupsSetNamedPortsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionInstanceGroupsSetNamedPortsRequest();
-      var od = new api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(o.toJson());
+      var od =
+          new api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(o.toJson());
       checkRegionInstanceGroupsSetNamedPortsRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-RegionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRegionList();
@@ -11771,7 +11671,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceCommitment", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceCommitment();
@@ -11780,7 +11679,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceGroupReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceGroupReference();
@@ -11789,7 +11687,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouteWarningsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouteWarningsData();
@@ -11798,7 +11695,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouteWarnings", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouteWarnings();
@@ -11807,7 +11703,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Route", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoute();
@@ -11816,7 +11711,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouteList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouteList();
@@ -11825,7 +11719,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Router", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouter();
@@ -11834,7 +11727,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterAggregatedList();
@@ -11843,7 +11735,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterBgp", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterBgp();
@@ -11852,7 +11743,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterBgpPeer", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterBgpPeer();
@@ -11861,7 +11751,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterInterface", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterInterface();
@@ -11870,7 +11759,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterList();
@@ -11879,7 +11767,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterStatus();
@@ -11888,7 +11775,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterStatusBgpPeerStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterStatusBgpPeerStatus();
@@ -11897,7 +11783,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RouterStatusResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRouterStatusResponse();
@@ -11906,7 +11791,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoutersPreviewResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoutersPreviewResponse();
@@ -11915,7 +11799,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoutersScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoutersScopedListWarningData();
@@ -11924,7 +11807,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoutersScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoutersScopedListWarning();
@@ -11933,7 +11815,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoutersScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoutersScopedList();
@@ -11942,7 +11823,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SSLHealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildSSLHealthCheck();
@@ -11951,7 +11831,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Scheduling", () {
     unittest.test("to-json--from-json", () {
       var o = buildScheduling();
@@ -11960,7 +11839,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SerialPortOutput", () {
     unittest.test("to-json--from-json", () {
       var o = buildSerialPortOutput();
@@ -11969,7 +11847,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ServiceAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildServiceAccount();
@@ -11978,7 +11855,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Snapshot", () {
     unittest.test("to-json--from-json", () {
       var o = buildSnapshot();
@@ -11987,7 +11863,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SnapshotList", () {
     unittest.test("to-json--from-json", () {
       var o = buildSnapshotList();
@@ -11996,7 +11871,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SslCertificate", () {
     unittest.test("to-json--from-json", () {
       var o = buildSslCertificate();
@@ -12005,7 +11879,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SslCertificateList", () {
     unittest.test("to-json--from-json", () {
       var o = buildSslCertificateList();
@@ -12014,7 +11887,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Subnetwork", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetwork();
@@ -12023,7 +11895,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworkAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworkAggregatedList();
@@ -12032,7 +11903,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworkList", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworkList();
@@ -12041,7 +11911,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworkSecondaryRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworkSecondaryRange();
@@ -12050,7 +11919,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworksExpandIpCidrRangeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworksExpandIpCidrRangeRequest();
@@ -12059,7 +11927,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworksScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworksScopedListWarningData();
@@ -12068,7 +11935,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworksScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworksScopedListWarning();
@@ -12077,7 +11943,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworksScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworksScopedList();
@@ -12086,16 +11951,15 @@
     });
   });
 
-
   unittest.group("obj-schema-SubnetworksSetPrivateIpGoogleAccessRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubnetworksSetPrivateIpGoogleAccessRequest();
-      var od = new api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(o.toJson());
+      var od = new api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(
+          o.toJson());
       checkSubnetworksSetPrivateIpGoogleAccessRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TCPHealthCheck", () {
     unittest.test("to-json--from-json", () {
       var o = buildTCPHealthCheck();
@@ -12104,7 +11968,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Tags", () {
     unittest.test("to-json--from-json", () {
       var o = buildTags();
@@ -12113,7 +11976,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetHttpProxy", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetHttpProxy();
@@ -12122,7 +11984,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetHttpProxyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetHttpProxyList();
@@ -12131,16 +11992,15 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetHttpsProxiesSetSslCertificatesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetHttpsProxiesSetSslCertificatesRequest();
-      var od = new api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(o.toJson());
+      var od = new api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(
+          o.toJson());
       checkTargetHttpsProxiesSetSslCertificatesRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetHttpsProxy", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetHttpsProxy();
@@ -12149,7 +12009,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetHttpsProxyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetHttpsProxyList();
@@ -12158,7 +12017,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetInstance", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetInstance();
@@ -12167,7 +12025,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetInstanceAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetInstanceAggregatedList();
@@ -12176,7 +12033,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetInstanceList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetInstanceList();
@@ -12185,16 +12041,15 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetInstancesScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetInstancesScopedListWarningData();
-      var od = new api.TargetInstancesScopedListWarningData.fromJson(o.toJson());
+      var od =
+          new api.TargetInstancesScopedListWarningData.fromJson(o.toJson());
       checkTargetInstancesScopedListWarningData(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetInstancesScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetInstancesScopedListWarning();
@@ -12203,7 +12058,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetInstancesScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetInstancesScopedList();
@@ -12212,7 +12066,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPool", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPool();
@@ -12221,7 +12074,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolAggregatedList();
@@ -12230,7 +12082,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolInstanceHealth", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolInstanceHealth();
@@ -12239,7 +12090,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolList();
@@ -12248,7 +12098,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsAddHealthCheckRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsAddHealthCheckRequest();
@@ -12257,7 +12106,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsAddInstanceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsAddInstanceRequest();
@@ -12266,7 +12114,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsRemoveHealthCheckRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsRemoveHealthCheckRequest();
@@ -12275,7 +12122,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsRemoveInstanceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsRemoveInstanceRequest();
@@ -12284,7 +12130,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsScopedListWarningData();
@@ -12293,7 +12138,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsScopedListWarning();
@@ -12302,7 +12146,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetPoolsScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetPoolsScopedList();
@@ -12311,7 +12154,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetReference();
@@ -12320,34 +12162,33 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetSslProxiesSetBackendServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetSslProxiesSetBackendServiceRequest();
-      var od = new api.TargetSslProxiesSetBackendServiceRequest.fromJson(o.toJson());
+      var od =
+          new api.TargetSslProxiesSetBackendServiceRequest.fromJson(o.toJson());
       checkTargetSslProxiesSetBackendServiceRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetSslProxiesSetProxyHeaderRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetSslProxiesSetProxyHeaderRequest();
-      var od = new api.TargetSslProxiesSetProxyHeaderRequest.fromJson(o.toJson());
+      var od =
+          new api.TargetSslProxiesSetProxyHeaderRequest.fromJson(o.toJson());
       checkTargetSslProxiesSetProxyHeaderRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetSslProxiesSetSslCertificatesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetSslProxiesSetSslCertificatesRequest();
-      var od = new api.TargetSslProxiesSetSslCertificatesRequest.fromJson(o.toJson());
+      var od = new api.TargetSslProxiesSetSslCertificatesRequest.fromJson(
+          o.toJson());
       checkTargetSslProxiesSetSslCertificatesRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetSslProxy", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetSslProxy();
@@ -12356,7 +12197,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetSslProxyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetSslProxyList();
@@ -12365,25 +12205,24 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetTcpProxiesSetBackendServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetTcpProxiesSetBackendServiceRequest();
-      var od = new api.TargetTcpProxiesSetBackendServiceRequest.fromJson(o.toJson());
+      var od =
+          new api.TargetTcpProxiesSetBackendServiceRequest.fromJson(o.toJson());
       checkTargetTcpProxiesSetBackendServiceRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetTcpProxiesSetProxyHeaderRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetTcpProxiesSetProxyHeaderRequest();
-      var od = new api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(o.toJson());
+      var od =
+          new api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(o.toJson());
       checkTargetTcpProxiesSetProxyHeaderRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetTcpProxy", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetTcpProxy();
@@ -12392,7 +12231,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetTcpProxyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetTcpProxyList();
@@ -12401,7 +12239,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetVpnGateway", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetVpnGateway();
@@ -12410,7 +12247,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetVpnGatewayAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetVpnGatewayAggregatedList();
@@ -12419,7 +12255,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetVpnGatewayList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetVpnGatewayList();
@@ -12428,16 +12263,15 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetVpnGatewaysScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetVpnGatewaysScopedListWarningData();
-      var od = new api.TargetVpnGatewaysScopedListWarningData.fromJson(o.toJson());
+      var od =
+          new api.TargetVpnGatewaysScopedListWarningData.fromJson(o.toJson());
       checkTargetVpnGatewaysScopedListWarningData(od);
     });
   });
 
-
   unittest.group("obj-schema-TargetVpnGatewaysScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetVpnGatewaysScopedListWarning();
@@ -12446,7 +12280,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetVpnGatewaysScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetVpnGatewaysScopedList();
@@ -12455,7 +12288,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestFailure", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestFailure();
@@ -12464,7 +12296,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMap", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMap();
@@ -12473,7 +12304,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMapList", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMapList();
@@ -12482,7 +12312,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMapReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMapReference();
@@ -12491,7 +12320,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMapTest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMapTest();
@@ -12500,7 +12328,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMapValidationResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMapValidationResult();
@@ -12509,7 +12336,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMapsValidateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMapsValidateRequest();
@@ -12518,7 +12344,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlMapsValidateResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlMapsValidateResponse();
@@ -12527,7 +12352,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageExportLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageExportLocation();
@@ -12536,7 +12360,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VpnTunnel", () {
     unittest.test("to-json--from-json", () {
       var o = buildVpnTunnel();
@@ -12545,7 +12368,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VpnTunnelAggregatedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildVpnTunnelAggregatedList();
@@ -12554,7 +12376,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VpnTunnelList", () {
     unittest.test("to-json--from-json", () {
       var o = buildVpnTunnelList();
@@ -12563,7 +12384,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VpnTunnelsScopedListWarningData", () {
     unittest.test("to-json--from-json", () {
       var o = buildVpnTunnelsScopedListWarningData();
@@ -12572,7 +12392,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VpnTunnelsScopedListWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildVpnTunnelsScopedListWarning();
@@ -12581,7 +12400,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VpnTunnelsScopedList", () {
     unittest.test("to-json--from-json", () {
       var o = buildVpnTunnelsScopedList();
@@ -12590,7 +12408,6 @@
     });
   });
 
-
   unittest.group("obj-schema-XpnHostList", () {
     unittest.test("to-json--from-json", () {
       var o = buildXpnHostList();
@@ -12599,7 +12416,6 @@
     });
   });
 
-
   unittest.group("obj-schema-XpnResourceId", () {
     unittest.test("to-json--from-json", () {
       var o = buildXpnResourceId();
@@ -12608,7 +12424,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Zone", () {
     unittest.test("to-json--from-json", () {
       var o = buildZone();
@@ -12617,7 +12432,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ZoneList", () {
     unittest.test("to-json--from-json", () {
       var o = buildZoneList();
@@ -12626,7 +12440,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ZoneSetLabelsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildZoneSetLabelsRequest();
@@ -12635,12 +12448,11 @@
     });
   });
 
-
   unittest.group("resource-AcceleratorTypesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.AcceleratorTypesResourceApi res = new api.ComputeApi(mock).acceleratorTypes;
+      api.AcceleratorTypesResourceApi res =
+          new api.ComputeApi(mock).acceleratorTypes;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -12651,7 +12463,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12664,33 +12477,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAcceleratorTypeAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AcceleratorTypeAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.AcceleratorTypeAggregatedList response) {
         checkAcceleratorTypeAggregatedList(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AcceleratorTypesResourceApi res = new api.ComputeApi(mock).acceleratorTypes;
+      api.AcceleratorTypesResourceApi res =
+          new api.ComputeApi(mock).acceleratorTypes;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_acceleratorType = "foo";
@@ -12699,7 +12523,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12712,29 +12537,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAcceleratorType());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_acceleratorType).then(unittest.expectAsync1(((api.AcceleratorType response) {
+      res
+          .get(arg_project, arg_zone, arg_acceleratorType)
+          .then(unittest.expectAsync1(((api.AcceleratorType response) {
         checkAcceleratorType(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AcceleratorTypesResourceApi res = new api.ComputeApi(mock).acceleratorTypes;
+      api.AcceleratorTypesResourceApi res =
+          new api.ComputeApi(mock).acceleratorTypes;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_filter = "foo";
@@ -12746,7 +12574,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12759,35 +12588,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAcceleratorTypeList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AcceleratorTypeList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.AcceleratorTypeList response) {
         checkAcceleratorTypeList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AddressesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.AddressesResourceApi res = new api.ComputeApi(mock).addresses;
       var arg_project = "foo";
@@ -12800,7 +12636,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12813,31 +12650,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAddressAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AddressAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.AddressAggregatedList response) {
         checkAddressAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.AddressesResourceApi res = new api.ComputeApi(mock).addresses;
       var arg_project = "foo";
@@ -12849,7 +12695,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12862,28 +12709,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_address, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_address,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AddressesResourceApi res = new api.ComputeApi(mock).addresses;
       var arg_project = "foo";
@@ -12894,7 +12745,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12907,27 +12759,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAddress());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_address).then(unittest.expectAsync1(((api.Address response) {
+      res
+          .get(arg_project, arg_region, arg_address)
+          .then(unittest.expectAsync1(((api.Address response) {
         checkAddress(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.AddressesResourceApi res = new api.ComputeApi(mock).addresses;
       var arg_request = buildAddress();
@@ -12942,7 +12796,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -12955,28 +12810,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.AddressesResourceApi res = new api.ComputeApi(mock).addresses;
       var arg_project = "foo";
@@ -12990,7 +12849,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13003,35 +12863,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAddressList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AddressList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.AddressList response) {
         checkAddressList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AutoscalersResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_project = "foo";
@@ -13044,7 +12911,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13057,31 +12925,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAutoscalerAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AutoscalerAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.AutoscalerAggregatedList response) {
         checkAutoscalerAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_project = "foo";
@@ -13093,7 +12970,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13106,28 +12984,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_autoscaler, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_zone, arg_autoscaler,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_project = "foo";
@@ -13138,7 +13020,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13151,27 +13034,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAutoscaler());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_autoscaler).then(unittest.expectAsync1(((api.Autoscaler response) {
+      res
+          .get(arg_project, arg_zone, arg_autoscaler)
+          .then(unittest.expectAsync1(((api.Autoscaler response) {
         checkAutoscaler(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_request = buildAutoscaler();
@@ -13186,7 +13071,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13199,28 +13085,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_zone, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_zone, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_project = "foo";
@@ -13234,7 +13123,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13247,31 +13137,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAutoscalerList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AutoscalerList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.AutoscalerList response) {
         checkAutoscalerList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_request = buildAutoscaler();
@@ -13287,7 +13186,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13300,29 +13200,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_zone, autoscaler: arg_autoscaler, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_zone,
+              autoscaler: arg_autoscaler, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.AutoscalersResourceApi res = new api.ComputeApi(mock).autoscalers;
       var arg_request = buildAutoscaler();
@@ -13338,7 +13243,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13351,35 +13257,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_zone, autoscaler: arg_autoscaler, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_zone,
+              autoscaler: arg_autoscaler, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-BackendBucketsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.BackendBucketsResourceApi res = new api.ComputeApi(mock).backendBuckets;
+      api.BackendBucketsResourceApi res =
+          new api.ComputeApi(mock).backendBuckets;
       var arg_project = "foo";
       var arg_backendBucket = "foo";
       var arg_requestId = "foo";
@@ -13388,7 +13298,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13401,30 +13312,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_backendBucket, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_backendBucket, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.BackendBucketsResourceApi res = new api.ComputeApi(mock).backendBuckets;
+      api.BackendBucketsResourceApi res =
+          new api.ComputeApi(mock).backendBuckets;
       var arg_project = "foo";
       var arg_backendBucket = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -13432,7 +13347,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13445,29 +13361,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendBucket());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_backendBucket).then(unittest.expectAsync1(((api.BackendBucket response) {
+      res
+          .get(arg_project, arg_backendBucket)
+          .then(unittest.expectAsync1(((api.BackendBucket response) {
         checkBackendBucket(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.BackendBucketsResourceApi res = new api.ComputeApi(mock).backendBuckets;
+      api.BackendBucketsResourceApi res =
+          new api.ComputeApi(mock).backendBuckets;
       var arg_request = buildBackendBucket();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -13479,7 +13398,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13492,30 +13412,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.BackendBucketsResourceApi res = new api.ComputeApi(mock).backendBuckets;
+      api.BackendBucketsResourceApi res =
+          new api.ComputeApi(mock).backendBuckets;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -13526,7 +13450,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13539,33 +13464,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendBucketList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.BackendBucketList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.BackendBucketList response) {
         checkBackendBucketList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.BackendBucketsResourceApi res = new api.ComputeApi(mock).backendBuckets;
+      api.BackendBucketsResourceApi res =
+          new api.ComputeApi(mock).backendBuckets;
       var arg_request = buildBackendBucket();
       var arg_project = "foo";
       var arg_backendBucket = "foo";
@@ -13578,7 +13513,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13591,30 +13527,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_backendBucket, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_backendBucket,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.BackendBucketsResourceApi res = new api.ComputeApi(mock).backendBuckets;
+      api.BackendBucketsResourceApi res =
+          new api.ComputeApi(mock).backendBuckets;
       var arg_request = buildBackendBucket();
       var arg_project = "foo";
       var arg_backendBucket = "foo";
@@ -13627,7 +13568,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13640,34 +13582,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_backendBucket, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_backendBucket,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-BackendServicesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -13678,7 +13623,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13691,33 +13637,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendServiceAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.BackendServiceAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.BackendServiceAggregatedList response) {
         checkBackendServiceAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_project = "foo";
       var arg_backendService = "foo";
       var arg_requestId = "foo";
@@ -13726,7 +13683,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13739,30 +13697,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_backendService, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_backendService, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_project = "foo";
       var arg_backendService = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -13770,7 +13732,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13783,29 +13746,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_backendService).then(unittest.expectAsync1(((api.BackendService response) {
+      res
+          .get(arg_project, arg_backendService)
+          .then(unittest.expectAsync1(((api.BackendService response) {
         checkBackendService(response);
       })));
     });
 
     unittest.test("method--getHealth", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_request = buildResourceGroupReference();
       var arg_project = "foo";
       var arg_backendService = "foo";
@@ -13817,7 +13783,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13830,29 +13797,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendServiceGroupHealth());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getHealth(arg_request, arg_project, arg_backendService).then(unittest.expectAsync1(((api.BackendServiceGroupHealth response) {
+      res.getHealth(arg_request, arg_project, arg_backendService).then(
+          unittest.expectAsync1(((api.BackendServiceGroupHealth response) {
         checkBackendServiceGroupHealth(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_request = buildBackendService();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -13864,7 +13833,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13877,30 +13847,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -13911,7 +13885,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13924,33 +13899,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendServiceList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.BackendServiceList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.BackendServiceList response) {
         checkBackendServiceList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_request = buildBackendService();
       var arg_project = "foo";
       var arg_backendService = "foo";
@@ -13963,7 +13948,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -13976,30 +13962,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_backendService, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_backendService,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.BackendServicesResourceApi res = new api.ComputeApi(mock).backendServices;
+      api.BackendServicesResourceApi res =
+          new api.ComputeApi(mock).backendServices;
       var arg_request = buildBackendService();
       var arg_project = "foo";
       var arg_backendService = "foo";
@@ -14012,7 +14003,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14025,32 +14017,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_backendService, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_backendService,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DiskTypesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.DiskTypesResourceApi res = new api.ComputeApi(mock).diskTypes;
       var arg_project = "foo";
@@ -14063,7 +14057,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14076,31 +14071,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDiskTypeAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.DiskTypeAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.DiskTypeAggregatedList response) {
         checkDiskTypeAggregatedList(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DiskTypesResourceApi res = new api.ComputeApi(mock).diskTypes;
       var arg_project = "foo";
@@ -14111,7 +14115,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14124,27 +14129,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDiskType());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_diskType).then(unittest.expectAsync1(((api.DiskType response) {
+      res
+          .get(arg_project, arg_zone, arg_diskType)
+          .then(unittest.expectAsync1(((api.DiskType response) {
         checkDiskType(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.DiskTypesResourceApi res = new api.ComputeApi(mock).diskTypes;
       var arg_project = "foo";
@@ -14158,7 +14165,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14171,35 +14179,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDiskTypeList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.DiskTypeList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.DiskTypeList response) {
         checkDiskTypeList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DisksResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_project = "foo";
@@ -14212,7 +14227,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14225,31 +14241,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDiskAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.DiskAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.DiskAggregatedList response) {
         checkDiskAggregatedList(response);
       })));
     });
 
     unittest.test("method--createSnapshot", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_request = buildSnapshot();
@@ -14266,7 +14291,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14279,29 +14305,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["guestFlush"].first, unittest.equals("$arg_guestFlush"));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["guestFlush"].first, unittest.equals("$arg_guestFlush"));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.createSnapshot(arg_request, arg_project, arg_zone, arg_disk, guestFlush: arg_guestFlush, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .createSnapshot(arg_request, arg_project, arg_zone, arg_disk,
+              guestFlush: arg_guestFlush, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_project = "foo";
@@ -14313,7 +14344,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14326,28 +14358,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_disk, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_zone, arg_disk, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_project = "foo";
@@ -14358,7 +14393,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14371,27 +14407,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDisk());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_disk).then(unittest.expectAsync1(((api.Disk response) {
+      res
+          .get(arg_project, arg_zone, arg_disk)
+          .then(unittest.expectAsync1(((api.Disk response) {
         checkDisk(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_request = buildDisk();
@@ -14407,7 +14445,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14420,29 +14459,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-        unittest.expect(queryMap["sourceImage"].first, unittest.equals(arg_sourceImage));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
+        unittest.expect(
+            queryMap["sourceImage"].first, unittest.equals(arg_sourceImage));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_zone, requestId: arg_requestId, sourceImage: arg_sourceImage).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_zone,
+              requestId: arg_requestId, sourceImage: arg_sourceImage)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_project = "foo";
@@ -14456,7 +14500,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14469,31 +14514,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDiskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.DiskList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.DiskList response) {
         checkDiskList(response);
       })));
     });
 
     unittest.test("method--resize", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_request = buildDisksResizeRequest();
@@ -14509,7 +14563,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14522,28 +14577,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resize(arg_request, arg_project, arg_zone, arg_disk, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .resize(arg_request, arg_project, arg_zone, arg_disk,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setLabels", () {
-
       var mock = new HttpServerMock();
       api.DisksResourceApi res = new api.ComputeApi(mock).disks;
       var arg_request = buildZoneSetLabelsRequest();
@@ -14559,7 +14618,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14572,32 +14632,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setLabels(arg_request, arg_project, arg_zone, arg_resource, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setLabels(arg_request, arg_project, arg_zone, arg_resource,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-FirewallsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.FirewallsResourceApi res = new api.ComputeApi(mock).firewalls;
       var arg_project = "foo";
@@ -14608,7 +14670,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14621,28 +14684,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_firewall, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_firewall, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.FirewallsResourceApi res = new api.ComputeApi(mock).firewalls;
       var arg_project = "foo";
@@ -14652,7 +14718,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14665,27 +14732,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFirewall());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_firewall).then(unittest.expectAsync1(((api.Firewall response) {
+      res
+          .get(arg_project, arg_firewall)
+          .then(unittest.expectAsync1(((api.Firewall response) {
         checkFirewall(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.FirewallsResourceApi res = new api.ComputeApi(mock).firewalls;
       var arg_request = buildFirewall();
@@ -14699,7 +14768,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14712,28 +14782,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.FirewallsResourceApi res = new api.ComputeApi(mock).firewalls;
       var arg_project = "foo";
@@ -14746,7 +14819,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14759,31 +14833,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFirewallList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.FirewallList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.FirewallList response) {
         checkFirewallList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.FirewallsResourceApi res = new api.ComputeApi(mock).firewalls;
       var arg_request = buildFirewall();
@@ -14798,7 +14881,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14811,28 +14895,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_firewall, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_firewall,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.FirewallsResourceApi res = new api.ComputeApi(mock).firewalls;
       var arg_request = buildFirewall();
@@ -14847,7 +14935,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14860,34 +14949,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_firewall, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_firewall,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ForwardingRulesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.ForwardingRulesResourceApi res = new api.ComputeApi(mock).forwardingRules;
+      api.ForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).forwardingRules;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -14898,7 +14990,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14911,33 +15004,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildForwardingRuleAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ForwardingRuleAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.ForwardingRuleAggregatedList response) {
         checkForwardingRuleAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ForwardingRulesResourceApi res = new api.ComputeApi(mock).forwardingRules;
+      api.ForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).forwardingRules;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_forwardingRule = "foo";
@@ -14947,7 +15051,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -14960,30 +15065,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_forwardingRule, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_forwardingRule,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ForwardingRulesResourceApi res = new api.ComputeApi(mock).forwardingRules;
+      api.ForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).forwardingRules;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_forwardingRule = "foo";
@@ -14992,7 +15102,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15005,29 +15116,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildForwardingRule());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_forwardingRule).then(unittest.expectAsync1(((api.ForwardingRule response) {
+      res
+          .get(arg_project, arg_region, arg_forwardingRule)
+          .then(unittest.expectAsync1(((api.ForwardingRule response) {
         checkForwardingRule(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ForwardingRulesResourceApi res = new api.ComputeApi(mock).forwardingRules;
+      api.ForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).forwardingRules;
       var arg_request = buildForwardingRule();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -15040,7 +15154,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15053,30 +15168,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ForwardingRulesResourceApi res = new api.ComputeApi(mock).forwardingRules;
+      api.ForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).forwardingRules;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -15088,7 +15208,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15101,33 +15222,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildForwardingRuleList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ForwardingRuleList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ForwardingRuleList response) {
         checkForwardingRuleList(response);
       })));
     });
 
     unittest.test("method--setTarget", () {
-
       var mock = new HttpServerMock();
-      api.ForwardingRulesResourceApi res = new api.ComputeApi(mock).forwardingRules;
+      api.ForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).forwardingRules;
       var arg_request = buildTargetReference();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -15141,7 +15272,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15154,34 +15286,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setTarget(arg_request, arg_project, arg_region, arg_forwardingRule, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setTarget(arg_request, arg_project, arg_region, arg_forwardingRule,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GlobalAddressesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.GlobalAddressesResourceApi res = new api.ComputeApi(mock).globalAddresses;
+      api.GlobalAddressesResourceApi res =
+          new api.ComputeApi(mock).globalAddresses;
       var arg_project = "foo";
       var arg_address = "foo";
       var arg_requestId = "foo";
@@ -15190,7 +15325,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15203,30 +15339,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_address, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_address, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.GlobalAddressesResourceApi res = new api.ComputeApi(mock).globalAddresses;
+      api.GlobalAddressesResourceApi res =
+          new api.ComputeApi(mock).globalAddresses;
       var arg_project = "foo";
       var arg_address = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -15234,7 +15374,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15247,29 +15388,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAddress());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_address).then(unittest.expectAsync1(((api.Address response) {
+      res
+          .get(arg_project, arg_address)
+          .then(unittest.expectAsync1(((api.Address response) {
         checkAddress(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.GlobalAddressesResourceApi res = new api.ComputeApi(mock).globalAddresses;
+      api.GlobalAddressesResourceApi res =
+          new api.ComputeApi(mock).globalAddresses;
       var arg_request = buildAddress();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -15281,7 +15425,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15294,30 +15439,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GlobalAddressesResourceApi res = new api.ComputeApi(mock).globalAddresses;
+      api.GlobalAddressesResourceApi res =
+          new api.ComputeApi(mock).globalAddresses;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -15328,7 +15477,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15341,37 +15491,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAddressList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AddressList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.AddressList response) {
         checkAddressList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GlobalForwardingRulesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.GlobalForwardingRulesResourceApi res = new api.ComputeApi(mock).globalForwardingRules;
+      api.GlobalForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).globalForwardingRules;
       var arg_project = "foo";
       var arg_forwardingRule = "foo";
       var arg_requestId = "foo";
@@ -15380,7 +15538,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15393,30 +15552,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_forwardingRule, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_forwardingRule, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.GlobalForwardingRulesResourceApi res = new api.ComputeApi(mock).globalForwardingRules;
+      api.GlobalForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).globalForwardingRules;
       var arg_project = "foo";
       var arg_forwardingRule = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -15424,7 +15587,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15437,29 +15601,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildForwardingRule());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_forwardingRule).then(unittest.expectAsync1(((api.ForwardingRule response) {
+      res
+          .get(arg_project, arg_forwardingRule)
+          .then(unittest.expectAsync1(((api.ForwardingRule response) {
         checkForwardingRule(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.GlobalForwardingRulesResourceApi res = new api.ComputeApi(mock).globalForwardingRules;
+      api.GlobalForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).globalForwardingRules;
       var arg_request = buildForwardingRule();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -15471,7 +15638,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15484,30 +15652,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GlobalForwardingRulesResourceApi res = new api.ComputeApi(mock).globalForwardingRules;
+      api.GlobalForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).globalForwardingRules;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -15518,7 +15690,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15531,33 +15704,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildForwardingRuleList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ForwardingRuleList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ForwardingRuleList response) {
         checkForwardingRuleList(response);
       })));
     });
 
     unittest.test("method--setTarget", () {
-
       var mock = new HttpServerMock();
-      api.GlobalForwardingRulesResourceApi res = new api.ComputeApi(mock).globalForwardingRules;
+      api.GlobalForwardingRulesResourceApi res =
+          new api.ComputeApi(mock).globalForwardingRules;
       var arg_request = buildTargetReference();
       var arg_project = "foo";
       var arg_forwardingRule = "foo";
@@ -15570,7 +15753,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15583,34 +15767,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setTarget(arg_request, arg_project, arg_forwardingRule, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setTarget(arg_request, arg_project, arg_forwardingRule,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GlobalOperationsResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.GlobalOperationsResourceApi res = new api.ComputeApi(mock).globalOperations;
+      api.GlobalOperationsResourceApi res =
+          new api.ComputeApi(mock).globalOperations;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -15621,7 +15808,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15634,33 +15822,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperationAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.OperationAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.OperationAggregatedList response) {
         checkOperationAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.GlobalOperationsResourceApi res = new api.ComputeApi(mock).globalOperations;
+      api.GlobalOperationsResourceApi res =
+          new api.ComputeApi(mock).globalOperations;
       var arg_project = "foo";
       var arg_operation = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -15668,7 +15866,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15681,27 +15880,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_operation).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_project, arg_operation)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.GlobalOperationsResourceApi res = new api.ComputeApi(mock).globalOperations;
+      api.GlobalOperationsResourceApi res =
+          new api.ComputeApi(mock).globalOperations;
       var arg_project = "foo";
       var arg_operation = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -15709,7 +15911,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15722,29 +15925,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_operation).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .get(arg_project, arg_operation)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GlobalOperationsResourceApi res = new api.ComputeApi(mock).globalOperations;
+      api.GlobalOperationsResourceApi res =
+          new api.ComputeApi(mock).globalOperations;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -15755,7 +15961,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15768,35 +15975,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperationList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.OperationList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.OperationList response) {
         checkOperationList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-HealthChecksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.HealthChecksResourceApi res = new api.ComputeApi(mock).healthChecks;
       var arg_project = "foo";
@@ -15807,7 +16021,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15820,28 +16035,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_healthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_healthCheck, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.HealthChecksResourceApi res = new api.ComputeApi(mock).healthChecks;
       var arg_project = "foo";
@@ -15851,7 +16069,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15864,27 +16083,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHealthCheck());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_healthCheck).then(unittest.expectAsync1(((api.HealthCheck response) {
+      res
+          .get(arg_project, arg_healthCheck)
+          .then(unittest.expectAsync1(((api.HealthCheck response) {
         checkHealthCheck(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.HealthChecksResourceApi res = new api.ComputeApi(mock).healthChecks;
       var arg_request = buildHealthCheck();
@@ -15898,7 +16119,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15911,28 +16133,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.HealthChecksResourceApi res = new api.ComputeApi(mock).healthChecks;
       var arg_project = "foo";
@@ -15945,7 +16170,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -15958,31 +16184,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHealthCheckList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.HealthCheckList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.HealthCheckList response) {
         checkHealthCheckList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.HealthChecksResourceApi res = new api.ComputeApi(mock).healthChecks;
       var arg_request = buildHealthCheck();
@@ -15997,7 +16232,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16010,28 +16246,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_healthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_healthCheck,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.HealthChecksResourceApi res = new api.ComputeApi(mock).healthChecks;
       var arg_request = buildHealthCheck();
@@ -16046,7 +16286,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16059,34 +16300,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_healthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_healthCheck,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-HttpHealthChecksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.HttpHealthChecksResourceApi res = new api.ComputeApi(mock).httpHealthChecks;
+      api.HttpHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpHealthChecks;
       var arg_project = "foo";
       var arg_httpHealthCheck = "foo";
       var arg_requestId = "foo";
@@ -16095,7 +16339,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16108,30 +16353,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_httpHealthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_httpHealthCheck, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.HttpHealthChecksResourceApi res = new api.ComputeApi(mock).httpHealthChecks;
+      api.HttpHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpHealthChecks;
       var arg_project = "foo";
       var arg_httpHealthCheck = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -16139,7 +16388,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16152,29 +16402,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHttpHealthCheck());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_httpHealthCheck).then(unittest.expectAsync1(((api.HttpHealthCheck response) {
+      res
+          .get(arg_project, arg_httpHealthCheck)
+          .then(unittest.expectAsync1(((api.HttpHealthCheck response) {
         checkHttpHealthCheck(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.HttpHealthChecksResourceApi res = new api.ComputeApi(mock).httpHealthChecks;
+      api.HttpHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpHealthChecks;
       var arg_request = buildHttpHealthCheck();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -16186,7 +16439,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16199,30 +16453,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.HttpHealthChecksResourceApi res = new api.ComputeApi(mock).httpHealthChecks;
+      api.HttpHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpHealthChecks;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -16233,7 +16491,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16246,33 +16505,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHttpHealthCheckList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.HttpHealthCheckList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.HttpHealthCheckList response) {
         checkHttpHealthCheckList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.HttpHealthChecksResourceApi res = new api.ComputeApi(mock).httpHealthChecks;
+      api.HttpHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpHealthChecks;
       var arg_request = buildHttpHealthCheck();
       var arg_project = "foo";
       var arg_httpHealthCheck = "foo";
@@ -16285,7 +16554,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16298,30 +16568,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_httpHealthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_httpHealthCheck,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.HttpHealthChecksResourceApi res = new api.ComputeApi(mock).httpHealthChecks;
+      api.HttpHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpHealthChecks;
       var arg_request = buildHttpHealthCheck();
       var arg_project = "foo";
       var arg_httpHealthCheck = "foo";
@@ -16334,7 +16609,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16347,34 +16623,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_httpHealthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_httpHealthCheck,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-HttpsHealthChecksResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.HttpsHealthChecksResourceApi res = new api.ComputeApi(mock).httpsHealthChecks;
+      api.HttpsHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpsHealthChecks;
       var arg_project = "foo";
       var arg_httpsHealthCheck = "foo";
       var arg_requestId = "foo";
@@ -16383,7 +16662,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16396,30 +16676,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_httpsHealthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_httpsHealthCheck, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.HttpsHealthChecksResourceApi res = new api.ComputeApi(mock).httpsHealthChecks;
+      api.HttpsHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpsHealthChecks;
       var arg_project = "foo";
       var arg_httpsHealthCheck = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -16427,7 +16711,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16440,29 +16725,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHttpsHealthCheck());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_httpsHealthCheck).then(unittest.expectAsync1(((api.HttpsHealthCheck response) {
+      res
+          .get(arg_project, arg_httpsHealthCheck)
+          .then(unittest.expectAsync1(((api.HttpsHealthCheck response) {
         checkHttpsHealthCheck(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.HttpsHealthChecksResourceApi res = new api.ComputeApi(mock).httpsHealthChecks;
+      api.HttpsHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpsHealthChecks;
       var arg_request = buildHttpsHealthCheck();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -16474,7 +16762,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16487,30 +16776,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.HttpsHealthChecksResourceApi res = new api.ComputeApi(mock).httpsHealthChecks;
+      api.HttpsHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpsHealthChecks;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -16521,7 +16814,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16534,33 +16828,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHttpsHealthCheckList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.HttpsHealthCheckList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.HttpsHealthCheckList response) {
         checkHttpsHealthCheckList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.HttpsHealthChecksResourceApi res = new api.ComputeApi(mock).httpsHealthChecks;
+      api.HttpsHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpsHealthChecks;
       var arg_request = buildHttpsHealthCheck();
       var arg_project = "foo";
       var arg_httpsHealthCheck = "foo";
@@ -16573,7 +16877,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16586,30 +16891,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_httpsHealthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_httpsHealthCheck,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.HttpsHealthChecksResourceApi res = new api.ComputeApi(mock).httpsHealthChecks;
+      api.HttpsHealthChecksResourceApi res =
+          new api.ComputeApi(mock).httpsHealthChecks;
       var arg_request = buildHttpsHealthCheck();
       var arg_project = "foo";
       var arg_httpsHealthCheck = "foo";
@@ -16622,7 +16932,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16635,32 +16946,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_httpsHealthCheck, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_httpsHealthCheck,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ImagesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_project = "foo";
@@ -16671,7 +16984,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16684,28 +16998,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_image, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_image, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--deprecate", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_request = buildDeprecationStatus();
@@ -16720,7 +17037,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16733,28 +17051,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deprecate(arg_request, arg_project, arg_image, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .deprecate(arg_request, arg_project, arg_image,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_project = "foo";
@@ -16764,7 +17086,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16777,27 +17100,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_image).then(unittest.expectAsync1(((api.Image response) {
+      res
+          .get(arg_project, arg_image)
+          .then(unittest.expectAsync1(((api.Image response) {
         checkImage(response);
       })));
     });
 
     unittest.test("method--getFromFamily", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_project = "foo";
@@ -16807,7 +17132,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16820,27 +17146,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getFromFamily(arg_project, arg_family).then(unittest.expectAsync1(((api.Image response) {
+      res
+          .getFromFamily(arg_project, arg_family)
+          .then(unittest.expectAsync1(((api.Image response) {
         checkImage(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_request = buildImage();
@@ -16855,7 +17183,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16868,29 +17197,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["forceCreate"].first, unittest.equals("$arg_forceCreate"));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["forceCreate"].first, unittest.equals("$arg_forceCreate"));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, forceCreate: arg_forceCreate, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project,
+              forceCreate: arg_forceCreate, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_project = "foo";
@@ -16903,7 +17237,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16916,31 +17251,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImageList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ImageList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ImageList response) {
         checkImageList(response);
       })));
     });
 
     unittest.test("method--setLabels", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.ComputeApi(mock).images;
       var arg_request = buildGlobalSetLabelsRequest();
@@ -16954,7 +17298,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -16967,47 +17312,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setLabels(arg_request, arg_project, arg_resource).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setLabels(arg_request, arg_project, arg_resource)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-InstanceGroupManagersResourceApi", () {
     unittest.test("method--abandonInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_request = buildInstanceGroupManagersAbandonInstancesRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.InstanceGroupManagersAbandonInstancesRequest.fromJson(json);
+        var obj =
+            new api.InstanceGroupManagersAbandonInstancesRequest.fromJson(json);
         checkInstanceGroupManagersAbandonInstancesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17020,30 +17368,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.abandonInstances(arg_request, arg_project, arg_zone, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .abandonInstances(
+              arg_request, arg_project, arg_zone, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -17054,7 +17408,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17067,33 +17422,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildInstanceGroupManagerAggregatedList());
+        var resp =
+            convert.JSON.encode(buildInstanceGroupManagerAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceGroupManagerAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.InstanceGroupManagerAggregatedList response) {
         checkInstanceGroupManagerAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
@@ -17103,7 +17470,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17116,44 +17484,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_zone, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--deleteInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_request = buildInstanceGroupManagersDeleteInstancesRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.InstanceGroupManagersDeleteInstancesRequest.fromJson(json);
+        var obj =
+            new api.InstanceGroupManagersDeleteInstancesRequest.fromJson(json);
         checkInstanceGroupManagersDeleteInstancesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17166,30 +17541,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteInstances(arg_request, arg_project, arg_zone, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .deleteInstances(
+              arg_request, arg_project, arg_zone, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
@@ -17198,7 +17579,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17211,29 +17593,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroupManager());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync1(((api.InstanceGroupManager response) {
+      res
+          .get(arg_project, arg_zone, arg_instanceGroupManager)
+          .then(unittest.expectAsync1(((api.InstanceGroupManager response) {
         checkInstanceGroupManager(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_request = buildInstanceGroupManager();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -17246,7 +17631,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17259,30 +17645,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_zone, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_zone, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_filter = "foo";
@@ -17294,7 +17684,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17307,33 +17698,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroupManagerList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceGroupManagerList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.InstanceGroupManagerList response) {
         checkInstanceGroupManagerList(response);
       })));
     });
 
     unittest.test("method--listManagedInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
@@ -17346,7 +17747,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17359,47 +17761,63 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["order_by"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["order_by"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildInstanceGroupManagersListManagedInstancesResponse());
+        var resp = convert.JSON
+            .encode(buildInstanceGroupManagersListManagedInstancesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listManagedInstances(arg_project, arg_zone, arg_instanceGroupManager, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceGroupManagersListManagedInstancesResponse response) {
+      res
+          .listManagedInstances(arg_project, arg_zone, arg_instanceGroupManager,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(
+              ((api.InstanceGroupManagersListManagedInstancesResponse
+                  response) {
         checkInstanceGroupManagersListManagedInstancesResponse(response);
       })));
     });
 
     unittest.test("method--recreateInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_request = buildInstanceGroupManagersRecreateInstancesRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.InstanceGroupManagersRecreateInstancesRequest.fromJson(json);
+        var obj =
+            new api.InstanceGroupManagersRecreateInstancesRequest.fromJson(
+                json);
         checkInstanceGroupManagersRecreateInstancesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17412,30 +17830,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.recreateInstances(arg_request, arg_project, arg_zone, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .recreateInstances(
+              arg_request, arg_project, arg_zone, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--resize", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
@@ -17446,7 +17870,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17459,45 +17884,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["size"].first), unittest.equals(arg_size));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            core.int.parse(queryMap["size"].first), unittest.equals(arg_size));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resize(arg_project, arg_zone, arg_instanceGroupManager, arg_size, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .resize(arg_project, arg_zone, arg_instanceGroupManager, arg_size,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setInstanceTemplate", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_request = buildInstanceGroupManagersSetInstanceTemplateRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(json);
+        var obj =
+            new api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(
+                json);
         checkInstanceGroupManagersSetInstanceTemplateRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17510,44 +17944,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setInstanceTemplate(arg_request, arg_project, arg_zone, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setInstanceTemplate(
+              arg_request, arg_project, arg_zone, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setTargetPools", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupManagersResourceApi res = new api.ComputeApi(mock).instanceGroupManagers;
+      api.InstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).instanceGroupManagers;
       var arg_request = buildInstanceGroupManagersSetTargetPoolsRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(json);
+        var obj =
+            new api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(json);
         checkInstanceGroupManagersSetTargetPoolsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17560,34 +18002,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setTargetPools(arg_request, arg_project, arg_zone, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setTargetPools(
+              arg_request, arg_project, arg_zone, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-InstanceGroupsResourceApi", () {
     unittest.test("method--addInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_request = buildInstanceGroupsAddInstancesRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -17601,7 +18047,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17614,30 +18061,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addInstances(arg_request, arg_project, arg_zone, arg_instanceGroup, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .addInstances(arg_request, arg_project, arg_zone, arg_instanceGroup,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -17648,7 +18100,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17661,33 +18114,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroupAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceGroupAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.InstanceGroupAggregatedList response) {
         checkInstanceGroupAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroup = "foo";
@@ -17697,7 +18161,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17710,30 +18175,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_instanceGroup, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_zone, arg_instanceGroup,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_instanceGroup = "foo";
@@ -17742,7 +18212,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17755,29 +18226,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroup());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_instanceGroup).then(unittest.expectAsync1(((api.InstanceGroup response) {
+      res
+          .get(arg_project, arg_zone, arg_instanceGroup)
+          .then(unittest.expectAsync1(((api.InstanceGroup response) {
         checkInstanceGroup(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_request = buildInstanceGroup();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -17790,7 +18264,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17803,30 +18278,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_zone, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_zone, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_filter = "foo";
@@ -17838,7 +18317,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17851,33 +18331,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroupList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceGroupList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.InstanceGroupList response) {
         checkInstanceGroupList(response);
       })));
     });
 
     unittest.test("method--listInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_request = buildInstanceGroupsListInstancesRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -17894,7 +18384,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17907,33 +18398,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroupsListInstances());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listInstances(arg_request, arg_project, arg_zone, arg_instanceGroup, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceGroupsListInstances response) {
+      res
+          .listInstances(arg_request, arg_project, arg_zone, arg_instanceGroup,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.InstanceGroupsListInstances response) {
         checkInstanceGroupsListInstances(response);
       })));
     });
 
     unittest.test("method--removeInstances", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_request = buildInstanceGroupsRemoveInstancesRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -17947,7 +18449,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -17960,30 +18463,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.removeInstances(arg_request, arg_project, arg_zone, arg_instanceGroup, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .removeInstances(
+              arg_request, arg_project, arg_zone, arg_instanceGroup,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setNamedPorts", () {
-
       var mock = new HttpServerMock();
-      api.InstanceGroupsResourceApi res = new api.ComputeApi(mock).instanceGroups;
+      api.InstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).instanceGroups;
       var arg_request = buildInstanceGroupsSetNamedPortsRequest();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -17997,7 +18506,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18010,34 +18520,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setNamedPorts(arg_request, arg_project, arg_zone, arg_instanceGroup, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setNamedPorts(arg_request, arg_project, arg_zone, arg_instanceGroup,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-InstanceTemplatesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.InstanceTemplatesResourceApi res = new api.ComputeApi(mock).instanceTemplates;
+      api.InstanceTemplatesResourceApi res =
+          new api.ComputeApi(mock).instanceTemplates;
       var arg_project = "foo";
       var arg_instanceTemplate = "foo";
       var arg_requestId = "foo";
@@ -18046,7 +18559,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18059,30 +18573,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_instanceTemplate, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_instanceTemplate, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.InstanceTemplatesResourceApi res = new api.ComputeApi(mock).instanceTemplates;
+      api.InstanceTemplatesResourceApi res =
+          new api.ComputeApi(mock).instanceTemplates;
       var arg_project = "foo";
       var arg_instanceTemplate = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -18090,7 +18608,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18103,29 +18622,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_instanceTemplate).then(unittest.expectAsync1(((api.InstanceTemplate response) {
+      res
+          .get(arg_project, arg_instanceTemplate)
+          .then(unittest.expectAsync1(((api.InstanceTemplate response) {
         checkInstanceTemplate(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.InstanceTemplatesResourceApi res = new api.ComputeApi(mock).instanceTemplates;
+      api.InstanceTemplatesResourceApi res =
+          new api.ComputeApi(mock).instanceTemplates;
       var arg_request = buildInstanceTemplate();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -18137,7 +18659,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18150,30 +18673,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.InstanceTemplatesResourceApi res = new api.ComputeApi(mock).instanceTemplates;
+      api.InstanceTemplatesResourceApi res =
+          new api.ComputeApi(mock).instanceTemplates;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -18184,7 +18711,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18197,35 +18725,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceTemplateList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceTemplateList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.InstanceTemplateList response) {
         checkInstanceTemplateList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-InstancesResourceApi", () {
     unittest.test("method--addAccessConfig", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildAccessConfig();
@@ -18242,7 +18777,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18255,29 +18791,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["networkInterface"].first, unittest.equals(arg_networkInterface));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(queryMap["networkInterface"].first,
+            unittest.equals(arg_networkInterface));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addAccessConfig(arg_request, arg_project, arg_zone, arg_instance, arg_networkInterface, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .addAccessConfig(arg_request, arg_project, arg_zone, arg_instance,
+              arg_networkInterface,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18290,7 +18832,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18303,31 +18846,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.InstanceAggregatedList response) {
         checkInstanceAggregatedList(response);
       })));
     });
 
     unittest.test("method--attachDisk", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildAttachedDisk();
@@ -18343,7 +18895,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18356,28 +18909,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.attachDisk(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .attachDisk(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18389,7 +18946,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18402,28 +18960,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_zone, arg_instance, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--deleteAccessConfig", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18437,7 +18998,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18450,30 +19012,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["accessConfig"].first, unittest.equals(arg_accessConfig));
-        unittest.expect(queryMap["networkInterface"].first, unittest.equals(arg_networkInterface));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["accessConfig"].first, unittest.equals(arg_accessConfig));
+        unittest.expect(queryMap["networkInterface"].first,
+            unittest.equals(arg_networkInterface));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteAccessConfig(arg_project, arg_zone, arg_instance, arg_accessConfig, arg_networkInterface, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .deleteAccessConfig(arg_project, arg_zone, arg_instance,
+              arg_accessConfig, arg_networkInterface,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--detachDisk", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18486,7 +19055,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18499,29 +19069,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["deviceName"].first, unittest.equals(arg_deviceName));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["deviceName"].first, unittest.equals(arg_deviceName));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.detachDisk(arg_project, arg_zone, arg_instance, arg_deviceName, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .detachDisk(arg_project, arg_zone, arg_instance, arg_deviceName,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18532,7 +19107,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18545,27 +19121,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstance());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_instance).then(unittest.expectAsync1(((api.Instance response) {
+      res
+          .get(arg_project, arg_zone, arg_instance)
+          .then(unittest.expectAsync1(((api.Instance response) {
         checkInstance(response);
       })));
     });
 
     unittest.test("method--getSerialPortOutput", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18578,7 +19156,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18591,29 +19170,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["port"].first), unittest.equals(arg_port));
+        unittest.expect(
+            core.int.parse(queryMap["port"].first), unittest.equals(arg_port));
         unittest.expect(queryMap["start"].first, unittest.equals(arg_start_1));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSerialPortOutput());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getSerialPortOutput(arg_project, arg_zone, arg_instance, port: arg_port, start_1: arg_start_1).then(unittest.expectAsync1(((api.SerialPortOutput response) {
+      res
+          .getSerialPortOutput(arg_project, arg_zone, arg_instance,
+              port: arg_port, start_1: arg_start_1)
+          .then(unittest.expectAsync1(((api.SerialPortOutput response) {
         checkSerialPortOutput(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildInstance();
@@ -18628,7 +19211,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18641,28 +19225,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_zone, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_zone, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18676,7 +19263,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18689,31 +19277,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.InstanceList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.InstanceList response) {
         checkInstanceList(response);
       })));
     });
 
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18725,7 +19322,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18738,28 +19336,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reset(arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .reset(arg_project, arg_zone, arg_instance, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setDiskAutoDelete", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -18773,7 +19374,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18786,30 +19388,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoDelete"].first, unittest.equals("$arg_autoDelete"));
-        unittest.expect(queryMap["deviceName"].first, unittest.equals(arg_deviceName));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["autoDelete"].first, unittest.equals("$arg_autoDelete"));
+        unittest.expect(
+            queryMap["deviceName"].first, unittest.equals(arg_deviceName));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setDiskAutoDelete(arg_project, arg_zone, arg_instance, arg_autoDelete, arg_deviceName, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setDiskAutoDelete(arg_project, arg_zone, arg_instance,
+              arg_autoDelete, arg_deviceName,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setLabels", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildInstancesSetLabelsRequest();
@@ -18825,7 +19434,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18838,28 +19448,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setLabels(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setLabels(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setMachineResources", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildInstancesSetMachineResourcesRequest();
@@ -18875,7 +19489,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18888,28 +19503,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setMachineResources(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setMachineResources(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setMachineType", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildInstancesSetMachineTypeRequest();
@@ -18925,7 +19544,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18938,28 +19558,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setMachineType(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setMachineType(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setMetadata", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildMetadata();
@@ -18975,7 +19599,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -18988,28 +19613,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setMetadata(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setMetadata(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setScheduling", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildScheduling();
@@ -19025,7 +19654,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19038,28 +19668,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setScheduling(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setScheduling(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setServiceAccount", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildInstancesSetServiceAccountRequest();
@@ -19075,7 +19709,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19088,28 +19723,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setServiceAccount(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setServiceAccount(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setTags", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildTags();
@@ -19125,7 +19764,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19138,28 +19778,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setTags(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setTags(arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--start", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -19171,7 +19815,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19184,28 +19829,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.start(arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .start(arg_project, arg_zone, arg_instance, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--startWithEncryptionKey", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_request = buildInstancesStartWithEncryptionKeyRequest();
@@ -19221,7 +19869,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19234,28 +19883,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.startWithEncryptionKey(arg_request, arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .startWithEncryptionKey(
+              arg_request, arg_project, arg_zone, arg_instance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.InstancesResourceApi res = new api.ComputeApi(mock).instances;
       var arg_project = "foo";
@@ -19267,7 +19921,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19280,32 +19935,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.stop(arg_project, arg_zone, arg_instance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .stop(arg_project, arg_zone, arg_instance, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LicensesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.LicensesResourceApi res = new api.ComputeApi(mock).licenses;
       var arg_project = "foo";
@@ -19315,7 +19971,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19328,31 +19985,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicense());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_license).then(unittest.expectAsync1(((api.License response) {
+      res
+          .get(arg_project, arg_license)
+          .then(unittest.expectAsync1(((api.License response) {
         checkLicense(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MachineTypesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.MachineTypesResourceApi res = new api.ComputeApi(mock).machineTypes;
       var arg_project = "foo";
@@ -19365,7 +20022,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19378,31 +20036,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMachineTypeAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.MachineTypeAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(
+              unittest.expectAsync1(((api.MachineTypeAggregatedList response) {
         checkMachineTypeAggregatedList(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.MachineTypesResourceApi res = new api.ComputeApi(mock).machineTypes;
       var arg_project = "foo";
@@ -19413,7 +20081,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19426,27 +20095,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMachineType());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_machineType).then(unittest.expectAsync1(((api.MachineType response) {
+      res
+          .get(arg_project, arg_zone, arg_machineType)
+          .then(unittest.expectAsync1(((api.MachineType response) {
         checkMachineType(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.MachineTypesResourceApi res = new api.ComputeApi(mock).machineTypes;
       var arg_project = "foo";
@@ -19460,7 +20131,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19473,35 +20145,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMachineTypeList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.MachineTypeList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.MachineTypeList response) {
         checkMachineTypeList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-NetworksResourceApi", () {
     unittest.test("method--addPeering", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_request = buildNetworksAddPeeringRequest();
@@ -19516,7 +20195,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19529,28 +20209,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addPeering(arg_request, arg_project, arg_network, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .addPeering(arg_request, arg_project, arg_network,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_project = "foo";
@@ -19561,7 +20245,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19574,28 +20259,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_network, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_network, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_project = "foo";
@@ -19605,7 +20293,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19618,27 +20307,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNetwork());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_network).then(unittest.expectAsync1(((api.Network response) {
+      res
+          .get(arg_project, arg_network)
+          .then(unittest.expectAsync1(((api.Network response) {
         checkNetwork(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_request = buildNetwork();
@@ -19652,7 +20343,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19665,28 +20357,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_project = "foo";
@@ -19699,7 +20394,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19712,31 +20408,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNetworkList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.NetworkList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.NetworkList response) {
         checkNetworkList(response);
       })));
     });
 
     unittest.test("method--removePeering", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_request = buildNetworksRemovePeeringRequest();
@@ -19751,7 +20456,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19764,28 +20470,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.removePeering(arg_request, arg_project, arg_network, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .removePeering(arg_request, arg_project, arg_network,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--switchToCustomMode", () {
-
       var mock = new HttpServerMock();
       api.NetworksResourceApi res = new api.ComputeApi(mock).networks;
       var arg_project = "foo";
@@ -19796,7 +20506,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19809,32 +20520,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.switchToCustomMode(arg_project, arg_network, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .switchToCustomMode(arg_project, arg_network,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--disableXpnHost", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_project = "foo";
@@ -19844,7 +20557,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19857,28 +20571,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.disableXpnHost(arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .disableXpnHost(arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--disableXpnResource", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildProjectsDisableXpnResourceRequest();
@@ -19892,7 +20609,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19905,28 +20623,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.disableXpnResource(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .disableXpnResource(arg_request, arg_project,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--enableXpnHost", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_project = "foo";
@@ -19936,7 +20658,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19949,28 +20672,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.enableXpnHost(arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .enableXpnHost(arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--enableXpnResource", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildProjectsEnableXpnResourceRequest();
@@ -19984,7 +20710,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -19997,28 +20724,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.enableXpnResource(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .enableXpnResource(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_project = "foo";
@@ -20027,7 +20757,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20040,16 +20771,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProject());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -20060,7 +20792,6 @@
     });
 
     unittest.test("method--getXpnHost", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_project = "foo";
@@ -20069,7 +20800,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20082,27 +20814,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProject());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getXpnHost(arg_project).then(unittest.expectAsync1(((api.Project response) {
+      res
+          .getXpnHost(arg_project)
+          .then(unittest.expectAsync1(((api.Project response) {
         checkProject(response);
       })));
     });
 
     unittest.test("method--getXpnResources", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_project = "foo";
@@ -20115,7 +20849,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20128,31 +20863,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["order_by"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["order_by"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProjectsGetXpnResources());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getXpnResources(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ProjectsGetXpnResources response) {
+      res
+          .getXpnResources(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ProjectsGetXpnResources response) {
         checkProjectsGetXpnResources(response);
       })));
     });
 
     unittest.test("method--listXpnHosts", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildProjectsListXpnHostsRequest();
@@ -20169,7 +20913,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20182,31 +20927,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["order_by"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["order_by"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildXpnHostList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listXpnHosts(arg_request, arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.XpnHostList response) {
+      res
+          .listXpnHosts(arg_request, arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.XpnHostList response) {
         checkXpnHostList(response);
       })));
     });
 
     unittest.test("method--moveDisk", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildDiskMoveRequest();
@@ -20220,7 +20974,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20233,28 +20988,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.moveDisk(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .moveDisk(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--moveInstance", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildInstanceMoveRequest();
@@ -20268,7 +21026,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20281,28 +21040,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.moveInstance(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .moveInstance(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setCommonInstanceMetadata", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildMetadata();
@@ -20316,7 +21078,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20329,28 +21092,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setCommonInstanceMetadata(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setCommonInstanceMetadata(arg_request, arg_project,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setUsageExportBucket", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.ComputeApi(mock).projects;
       var arg_request = buildUsageExportLocation();
@@ -20364,7 +21131,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20377,34 +21145,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setUsageExportBucket(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setUsageExportBucket(arg_request, arg_project,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionAutoscalersResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.RegionAutoscalersResourceApi res = new api.ComputeApi(mock).regionAutoscalers;
+      api.RegionAutoscalersResourceApi res =
+          new api.ComputeApi(mock).regionAutoscalers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_autoscaler = "foo";
@@ -20414,7 +21185,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20427,30 +21199,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_autoscaler, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_autoscaler,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RegionAutoscalersResourceApi res = new api.ComputeApi(mock).regionAutoscalers;
+      api.RegionAutoscalersResourceApi res =
+          new api.ComputeApi(mock).regionAutoscalers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_autoscaler = "foo";
@@ -20459,7 +21236,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20472,29 +21250,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAutoscaler());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_autoscaler).then(unittest.expectAsync1(((api.Autoscaler response) {
+      res
+          .get(arg_project, arg_region, arg_autoscaler)
+          .then(unittest.expectAsync1(((api.Autoscaler response) {
         checkAutoscaler(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.RegionAutoscalersResourceApi res = new api.ComputeApi(mock).regionAutoscalers;
+      api.RegionAutoscalersResourceApi res =
+          new api.ComputeApi(mock).regionAutoscalers;
       var arg_request = buildAutoscaler();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -20507,7 +21288,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20520,30 +21302,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RegionAutoscalersResourceApi res = new api.ComputeApi(mock).regionAutoscalers;
+      api.RegionAutoscalersResourceApi res =
+          new api.ComputeApi(mock).regionAutoscalers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -20555,7 +21342,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20568,33 +21356,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRegionAutoscalerList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RegionAutoscalerList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RegionAutoscalerList response) {
         checkRegionAutoscalerList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.RegionAutoscalersResourceApi res = new api.ComputeApi(mock).regionAutoscalers;
+      api.RegionAutoscalersResourceApi res =
+          new api.ComputeApi(mock).regionAutoscalers;
       var arg_request = buildAutoscaler();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -20608,7 +21406,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20621,31 +21420,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_region, autoscaler: arg_autoscaler, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_region,
+              autoscaler: arg_autoscaler, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.RegionAutoscalersResourceApi res = new api.ComputeApi(mock).regionAutoscalers;
+      api.RegionAutoscalersResourceApi res =
+          new api.ComputeApi(mock).regionAutoscalers;
       var arg_request = buildAutoscaler();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -20659,7 +21464,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20672,35 +21478,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["autoscaler"].first, unittest.equals(arg_autoscaler));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_region, autoscaler: arg_autoscaler, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_region,
+              autoscaler: arg_autoscaler, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionBackendServicesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_backendService = "foo";
@@ -20710,7 +21520,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20723,30 +21534,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_backendService, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_backendService,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_backendService = "foo";
@@ -20755,7 +21571,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20768,29 +21585,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_backendService).then(unittest.expectAsync1(((api.BackendService response) {
+      res
+          .get(arg_project, arg_region, arg_backendService)
+          .then(unittest.expectAsync1(((api.BackendService response) {
         checkBackendService(response);
       })));
     });
 
     unittest.test("method--getHealth", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_request = buildResourceGroupReference();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -20803,7 +21623,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20816,29 +21637,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendServiceGroupHealth());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getHealth(arg_request, arg_project, arg_region, arg_backendService).then(unittest.expectAsync1(((api.BackendServiceGroupHealth response) {
+      res
+          .getHealth(arg_request, arg_project, arg_region, arg_backendService)
+          .then(
+              unittest.expectAsync1(((api.BackendServiceGroupHealth response) {
         checkBackendServiceGroupHealth(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_request = buildBackendService();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -20851,7 +21676,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20864,30 +21690,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -20899,7 +21730,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20912,33 +21744,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBackendServiceList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.BackendServiceList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.BackendServiceList response) {
         checkBackendServiceList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_request = buildBackendService();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -20952,7 +21794,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -20965,30 +21808,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_region, arg_backendService, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_region, arg_backendService,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.RegionBackendServicesResourceApi res = new api.ComputeApi(mock).regionBackendServices;
+      api.RegionBackendServicesResourceApi res =
+          new api.ComputeApi(mock).regionBackendServices;
       var arg_request = buildBackendService();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -21002,7 +21850,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21015,34 +21864,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_region, arg_backendService, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_region, arg_backendService,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionCommitmentsResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.RegionCommitmentsResourceApi res = new api.ComputeApi(mock).regionCommitments;
+      api.RegionCommitmentsResourceApi res =
+          new api.ComputeApi(mock).regionCommitments;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -21053,7 +21905,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21066,33 +21919,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommitmentAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.CommitmentAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.CommitmentAggregatedList response) {
         checkCommitmentAggregatedList(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RegionCommitmentsResourceApi res = new api.ComputeApi(mock).regionCommitments;
+      api.RegionCommitmentsResourceApi res =
+          new api.ComputeApi(mock).regionCommitments;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_commitment = "foo";
@@ -21101,7 +21964,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21114,29 +21978,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommitment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_commitment).then(unittest.expectAsync1(((api.Commitment response) {
+      res
+          .get(arg_project, arg_region, arg_commitment)
+          .then(unittest.expectAsync1(((api.Commitment response) {
         checkCommitment(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.RegionCommitmentsResourceApi res = new api.ComputeApi(mock).regionCommitments;
+      api.RegionCommitmentsResourceApi res =
+          new api.ComputeApi(mock).regionCommitments;
       var arg_request = buildCommitment();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -21149,7 +22016,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21162,30 +22030,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RegionCommitmentsResourceApi res = new api.ComputeApi(mock).regionCommitments;
+      api.RegionCommitmentsResourceApi res =
+          new api.ComputeApi(mock).regionCommitments;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -21197,7 +22070,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21210,51 +22084,63 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommitmentList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.CommitmentList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.CommitmentList response) {
         checkCommitmentList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionInstanceGroupManagersResourceApi", () {
     unittest.test("method--abandonInstances", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
-      var arg_request = buildRegionInstanceGroupManagersAbandonInstancesRequest();
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
+      var arg_request =
+          buildRegionInstanceGroupManagersAbandonInstancesRequest();
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(
+                json);
         checkRegionInstanceGroupManagersAbandonInstancesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21267,30 +22153,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.abandonInstances(arg_request, arg_project, arg_region, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .abandonInstances(
+              arg_request, arg_project, arg_region, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
@@ -21300,7 +22192,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21313,44 +22206,53 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--deleteInstances", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
-      var arg_request = buildRegionInstanceGroupManagersDeleteInstancesRequest();
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
+      var arg_request =
+          buildRegionInstanceGroupManagersDeleteInstancesRequest();
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(
+                json);
         checkRegionInstanceGroupManagersDeleteInstancesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21363,30 +22265,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteInstances(arg_request, arg_project, arg_region, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .deleteInstances(
+              arg_request, arg_project, arg_region, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
@@ -21395,7 +22303,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21408,29 +22317,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroupManager());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_instanceGroupManager).then(unittest.expectAsync1(((api.InstanceGroupManager response) {
+      res
+          .get(arg_project, arg_region, arg_instanceGroupManager)
+          .then(unittest.expectAsync1(((api.InstanceGroupManager response) {
         checkInstanceGroupManager(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_request = buildInstanceGroupManager();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -21443,7 +22355,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21456,30 +22369,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -21491,7 +22409,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21504,33 +22423,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRegionInstanceGroupManagerList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RegionInstanceGroupManagerList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.RegionInstanceGroupManagerList response) {
         checkRegionInstanceGroupManagerList(response);
       })));
     });
 
     unittest.test("method--listManagedInstances", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
@@ -21543,7 +22473,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21556,47 +22487,62 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["order_by"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["order_by"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildRegionInstanceGroupManagersListInstancesResponse());
+        var resp = convert.JSON
+            .encode(buildRegionInstanceGroupManagersListInstancesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listManagedInstances(arg_project, arg_region, arg_instanceGroupManager, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RegionInstanceGroupManagersListInstancesResponse response) {
+      res
+          .listManagedInstances(
+              arg_project, arg_region, arg_instanceGroupManager,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(
+              ((api.RegionInstanceGroupManagersListInstancesResponse response) {
         checkRegionInstanceGroupManagersListInstancesResponse(response);
       })));
     });
 
     unittest.test("method--recreateInstances", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_request = buildRegionInstanceGroupManagersRecreateRequest();
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupManagersRecreateRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupManagersRecreateRequest.fromJson(json);
         checkRegionInstanceGroupManagersRecreateRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21609,30 +22555,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.recreateInstances(arg_request, arg_project, arg_region, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .recreateInstances(
+              arg_request, arg_project, arg_region, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--resize", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
@@ -21643,7 +22595,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21656,45 +22609,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["size"].first), unittest.equals(arg_size));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            core.int.parse(queryMap["size"].first), unittest.equals(arg_size));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resize(arg_project, arg_region, arg_instanceGroupManager, arg_size, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .resize(arg_project, arg_region, arg_instanceGroupManager, arg_size,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setInstanceTemplate", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_request = buildRegionInstanceGroupManagersSetTemplateRequest();
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(
+                json);
         checkRegionInstanceGroupManagersSetTemplateRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21707,44 +22669,53 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setInstanceTemplate(arg_request, arg_project, arg_region, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setInstanceTemplate(
+              arg_request, arg_project, arg_region, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setTargetPools", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupManagersResourceApi res = new api.ComputeApi(mock).regionInstanceGroupManagers;
+      api.RegionInstanceGroupManagersResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroupManagers;
       var arg_request = buildRegionInstanceGroupManagersSetTargetPoolsRequest();
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroupManager = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(
+                json);
         checkRegionInstanceGroupManagersSetTargetPoolsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21757,34 +22728,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setTargetPools(arg_request, arg_project, arg_region, arg_instanceGroupManager, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setTargetPools(
+              arg_request, arg_project, arg_region, arg_instanceGroupManager,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionInstanceGroupsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupsResourceApi res = new api.ComputeApi(mock).regionInstanceGroups;
+      api.RegionInstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroups;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroup = "foo";
@@ -21793,7 +22768,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21806,29 +22782,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceGroup());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_instanceGroup).then(unittest.expectAsync1(((api.InstanceGroup response) {
+      res
+          .get(arg_project, arg_region, arg_instanceGroup)
+          .then(unittest.expectAsync1(((api.InstanceGroup response) {
         checkInstanceGroup(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupsResourceApi res = new api.ComputeApi(mock).regionInstanceGroups;
+      api.RegionInstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroups;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -21840,7 +22819,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21853,33 +22833,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRegionInstanceGroupList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RegionInstanceGroupList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RegionInstanceGroupList response) {
         checkRegionInstanceGroupList(response);
       })));
     });
 
     unittest.test("method--listInstances", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupsResourceApi res = new api.ComputeApi(mock).regionInstanceGroups;
+      api.RegionInstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroups;
       var arg_request = buildRegionInstanceGroupsListInstancesRequest();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -21889,14 +22879,16 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupsListInstancesRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupsListInstancesRequest.fromJson(json);
         checkRegionInstanceGroupsListInstancesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21909,47 +22901,62 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildRegionInstanceGroupsListInstances());
+        var resp =
+            convert.JSON.encode(buildRegionInstanceGroupsListInstances());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listInstances(arg_request, arg_project, arg_region, arg_instanceGroup, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RegionInstanceGroupsListInstances response) {
+      res
+          .listInstances(
+              arg_request, arg_project, arg_region, arg_instanceGroup,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.RegionInstanceGroupsListInstances response) {
         checkRegionInstanceGroupsListInstances(response);
       })));
     });
 
     unittest.test("method--setNamedPorts", () {
-
       var mock = new HttpServerMock();
-      api.RegionInstanceGroupsResourceApi res = new api.ComputeApi(mock).regionInstanceGroups;
+      api.RegionInstanceGroupsResourceApi res =
+          new api.ComputeApi(mock).regionInstanceGroups;
       var arg_request = buildRegionInstanceGroupsSetNamedPortsRequest();
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_instanceGroup = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(json);
+        var obj =
+            new api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(json);
         checkRegionInstanceGroupsSetNamedPortsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -21962,34 +22969,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setNamedPorts(arg_request, arg_project, arg_region, arg_instanceGroup, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setNamedPorts(
+              arg_request, arg_project, arg_region, arg_instanceGroup,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionOperationsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.RegionOperationsResourceApi res = new api.ComputeApi(mock).regionOperations;
+      api.RegionOperationsResourceApi res =
+          new api.ComputeApi(mock).regionOperations;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_operation = "foo";
@@ -21998,7 +23009,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22011,27 +23023,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_operation).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_project, arg_region, arg_operation)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.RegionOperationsResourceApi res = new api.ComputeApi(mock).regionOperations;
+      api.RegionOperationsResourceApi res =
+          new api.ComputeApi(mock).regionOperations;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_operation = "foo";
@@ -22040,7 +23055,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22053,29 +23069,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_operation).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .get(arg_project, arg_region, arg_operation)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.RegionOperationsResourceApi res = new api.ComputeApi(mock).regionOperations;
+      api.RegionOperationsResourceApi res =
+          new api.ComputeApi(mock).regionOperations;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -22087,7 +23106,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22100,35 +23120,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperationList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.OperationList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.OperationList response) {
         checkOperationList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RegionsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RegionsResourceApi res = new api.ComputeApi(mock).regions;
       var arg_project = "foo";
@@ -22138,7 +23165,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22151,27 +23179,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRegion());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region).then(unittest.expectAsync1(((api.Region response) {
+      res
+          .get(arg_project, arg_region)
+          .then(unittest.expectAsync1(((api.Region response) {
         checkRegion(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RegionsResourceApi res = new api.ComputeApi(mock).regions;
       var arg_project = "foo";
@@ -22184,7 +23214,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22197,35 +23228,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRegionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RegionList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RegionList response) {
         checkRegionList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RoutersResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_project = "foo";
@@ -22238,7 +23276,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22251,31 +23290,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRouterAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RouterAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RouterAggregatedList response) {
         checkRouterAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_project = "foo";
@@ -22287,7 +23335,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22300,28 +23349,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_router, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_router, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_project = "foo";
@@ -22332,7 +23384,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22345,27 +23398,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRouter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_router).then(unittest.expectAsync1(((api.Router response) {
+      res
+          .get(arg_project, arg_region, arg_router)
+          .then(unittest.expectAsync1(((api.Router response) {
         checkRouter(response);
       })));
     });
 
     unittest.test("method--getRouterStatus", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_project = "foo";
@@ -22376,7 +23431,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22389,27 +23445,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRouterStatusResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getRouterStatus(arg_project, arg_region, arg_router).then(unittest.expectAsync1(((api.RouterStatusResponse response) {
+      res
+          .getRouterStatus(arg_project, arg_region, arg_router)
+          .then(unittest.expectAsync1(((api.RouterStatusResponse response) {
         checkRouterStatusResponse(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_request = buildRouter();
@@ -22424,7 +23482,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22437,28 +23496,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_project = "foo";
@@ -22472,7 +23535,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22485,31 +23549,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRouterList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RouterList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RouterList response) {
         checkRouterList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_request = buildRouter();
@@ -22525,7 +23598,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22538,28 +23612,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_region, arg_router, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_region, arg_router,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--preview", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_request = buildRouter();
@@ -22574,7 +23652,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22587,27 +23666,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoutersPreviewResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.preview(arg_request, arg_project, arg_region, arg_router).then(unittest.expectAsync1(((api.RoutersPreviewResponse response) {
+      res
+          .preview(arg_request, arg_project, arg_region, arg_router)
+          .then(unittest.expectAsync1(((api.RoutersPreviewResponse response) {
         checkRoutersPreviewResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.RoutersResourceApi res = new api.ComputeApi(mock).routers;
       var arg_request = buildRouter();
@@ -22623,7 +23704,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22636,32 +23718,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_region, arg_router, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_region, arg_router,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RoutesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RoutesResourceApi res = new api.ComputeApi(mock).routes;
       var arg_project = "foo";
@@ -22672,7 +23756,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22685,28 +23770,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_route, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_route, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RoutesResourceApi res = new api.ComputeApi(mock).routes;
       var arg_project = "foo";
@@ -22716,7 +23804,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22729,27 +23818,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoute());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_route).then(unittest.expectAsync1(((api.Route response) {
+      res
+          .get(arg_project, arg_route)
+          .then(unittest.expectAsync1(((api.Route response) {
         checkRoute(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.RoutesResourceApi res = new api.ComputeApi(mock).routes;
       var arg_request = buildRoute();
@@ -22763,7 +23854,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22776,28 +23868,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RoutesResourceApi res = new api.ComputeApi(mock).routes;
       var arg_project = "foo";
@@ -22810,7 +23905,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22823,35 +23919,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRouteList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RouteList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RouteList response) {
         checkRouteList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SnapshotsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SnapshotsResourceApi res = new api.ComputeApi(mock).snapshots;
       var arg_project = "foo";
@@ -22862,7 +23965,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22875,28 +23979,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_snapshot, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_snapshot, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SnapshotsResourceApi res = new api.ComputeApi(mock).snapshots;
       var arg_project = "foo";
@@ -22906,7 +24013,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22919,27 +24027,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSnapshot());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_snapshot).then(unittest.expectAsync1(((api.Snapshot response) {
+      res
+          .get(arg_project, arg_snapshot)
+          .then(unittest.expectAsync1(((api.Snapshot response) {
         checkSnapshot(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SnapshotsResourceApi res = new api.ComputeApi(mock).snapshots;
       var arg_project = "foo";
@@ -22952,7 +24062,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -22965,31 +24076,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSnapshotList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SnapshotList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SnapshotList response) {
         checkSnapshotList(response);
       })));
     });
 
     unittest.test("method--setLabels", () {
-
       var mock = new HttpServerMock();
       api.SnapshotsResourceApi res = new api.ComputeApi(mock).snapshots;
       var arg_request = buildGlobalSetLabelsRequest();
@@ -23003,7 +24123,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23016,33 +24137,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setLabels(arg_request, arg_project, arg_resource).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setLabels(arg_request, arg_project, arg_resource)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SslCertificatesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.SslCertificatesResourceApi res = new api.ComputeApi(mock).sslCertificates;
+      api.SslCertificatesResourceApi res =
+          new api.ComputeApi(mock).sslCertificates;
       var arg_project = "foo";
       var arg_sslCertificate = "foo";
       var arg_requestId = "foo";
@@ -23051,7 +24173,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23064,30 +24187,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_sslCertificate, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_sslCertificate, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.SslCertificatesResourceApi res = new api.ComputeApi(mock).sslCertificates;
+      api.SslCertificatesResourceApi res =
+          new api.ComputeApi(mock).sslCertificates;
       var arg_project = "foo";
       var arg_sslCertificate = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -23095,7 +24222,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23108,29 +24236,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSslCertificate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_sslCertificate).then(unittest.expectAsync1(((api.SslCertificate response) {
+      res
+          .get(arg_project, arg_sslCertificate)
+          .then(unittest.expectAsync1(((api.SslCertificate response) {
         checkSslCertificate(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.SslCertificatesResourceApi res = new api.ComputeApi(mock).sslCertificates;
+      api.SslCertificatesResourceApi res =
+          new api.ComputeApi(mock).sslCertificates;
       var arg_request = buildSslCertificate();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -23142,7 +24273,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23155,30 +24287,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.SslCertificatesResourceApi res = new api.ComputeApi(mock).sslCertificates;
+      api.SslCertificatesResourceApi res =
+          new api.ComputeApi(mock).sslCertificates;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -23189,7 +24325,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23202,35 +24339,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSslCertificateList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SslCertificateList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SslCertificateList response) {
         checkSslCertificateList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SubnetworksResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_project = "foo";
@@ -23243,7 +24387,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23256,31 +24401,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubnetworkAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SubnetworkAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SubnetworkAggregatedList response) {
         checkSubnetworkAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_project = "foo";
@@ -23292,7 +24446,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23305,28 +24460,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_subnetwork, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_subnetwork,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--expandIpCidrRange", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_request = buildSubnetworksExpandIpCidrRangeRequest();
@@ -23342,7 +24501,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23355,28 +24515,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.expandIpCidrRange(arg_request, arg_project, arg_region, arg_subnetwork, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .expandIpCidrRange(
+              arg_request, arg_project, arg_region, arg_subnetwork,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_project = "foo";
@@ -23387,7 +24552,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23400,27 +24566,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubnetwork());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_subnetwork).then(unittest.expectAsync1(((api.Subnetwork response) {
+      res
+          .get(arg_project, arg_region, arg_subnetwork)
+          .then(unittest.expectAsync1(((api.Subnetwork response) {
         checkSubnetwork(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_request = buildSubnetwork();
@@ -23435,7 +24603,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23448,28 +24617,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_project = "foo";
@@ -23483,7 +24656,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23496,31 +24670,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubnetworkList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SubnetworkList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SubnetworkList response) {
         checkSubnetworkList(response);
       })));
     });
 
     unittest.test("method--setPrivateIpGoogleAccess", () {
-
       var mock = new HttpServerMock();
       api.SubnetworksResourceApi res = new api.ComputeApi(mock).subnetworks;
       var arg_request = buildSubnetworksSetPrivateIpGoogleAccessRequest();
@@ -23529,14 +24712,16 @@
       var arg_subnetwork = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(json);
+        var obj =
+            new api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(json);
         checkSubnetworksSetPrivateIpGoogleAccessRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23549,34 +24734,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setPrivateIpGoogleAccess(arg_request, arg_project, arg_region, arg_subnetwork, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setPrivateIpGoogleAccess(
+              arg_request, arg_project, arg_region, arg_subnetwork,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetHttpProxiesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpProxiesResourceApi res = new api.ComputeApi(mock).targetHttpProxies;
+      api.TargetHttpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpProxies;
       var arg_project = "foo";
       var arg_targetHttpProxy = "foo";
       var arg_requestId = "foo";
@@ -23585,7 +24774,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23598,30 +24788,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_targetHttpProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_targetHttpProxy, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpProxiesResourceApi res = new api.ComputeApi(mock).targetHttpProxies;
+      api.TargetHttpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpProxies;
       var arg_project = "foo";
       var arg_targetHttpProxy = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -23629,7 +24823,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23642,29 +24837,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetHttpProxy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_targetHttpProxy).then(unittest.expectAsync1(((api.TargetHttpProxy response) {
+      res
+          .get(arg_project, arg_targetHttpProxy)
+          .then(unittest.expectAsync1(((api.TargetHttpProxy response) {
         checkTargetHttpProxy(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpProxiesResourceApi res = new api.ComputeApi(mock).targetHttpProxies;
+      api.TargetHttpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpProxies;
       var arg_request = buildTargetHttpProxy();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -23676,7 +24874,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23689,30 +24888,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpProxiesResourceApi res = new api.ComputeApi(mock).targetHttpProxies;
+      api.TargetHttpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpProxies;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -23723,7 +24926,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23736,33 +24940,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetHttpProxyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetHttpProxyList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetHttpProxyList response) {
         checkTargetHttpProxyList(response);
       })));
     });
 
     unittest.test("method--setUrlMap", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpProxiesResourceApi res = new api.ComputeApi(mock).targetHttpProxies;
+      api.TargetHttpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpProxies;
       var arg_request = buildUrlMapReference();
       var arg_project = "foo";
       var arg_targetHttpProxy = "foo";
@@ -23775,7 +24989,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23788,34 +25003,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setUrlMap(arg_request, arg_project, arg_targetHttpProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setUrlMap(arg_request, arg_project, arg_targetHttpProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetHttpsProxiesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpsProxiesResourceApi res = new api.ComputeApi(mock).targetHttpsProxies;
+      api.TargetHttpsProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpsProxies;
       var arg_project = "foo";
       var arg_targetHttpsProxy = "foo";
       var arg_requestId = "foo";
@@ -23824,7 +25042,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23837,30 +25056,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_targetHttpsProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_targetHttpsProxy, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpsProxiesResourceApi res = new api.ComputeApi(mock).targetHttpsProxies;
+      api.TargetHttpsProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpsProxies;
       var arg_project = "foo";
       var arg_targetHttpsProxy = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -23868,7 +25091,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23881,29 +25105,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetHttpsProxy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_targetHttpsProxy).then(unittest.expectAsync1(((api.TargetHttpsProxy response) {
+      res
+          .get(arg_project, arg_targetHttpsProxy)
+          .then(unittest.expectAsync1(((api.TargetHttpsProxy response) {
         checkTargetHttpsProxy(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpsProxiesResourceApi res = new api.ComputeApi(mock).targetHttpsProxies;
+      api.TargetHttpsProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpsProxies;
       var arg_request = buildTargetHttpsProxy();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -23915,7 +25142,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23928,30 +25156,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpsProxiesResourceApi res = new api.ComputeApi(mock).targetHttpsProxies;
+      api.TargetHttpsProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpsProxies;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -23962,7 +25194,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -23975,46 +25208,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetHttpsProxyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetHttpsProxyList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetHttpsProxyList response) {
         checkTargetHttpsProxyList(response);
       })));
     });
 
     unittest.test("method--setSslCertificates", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpsProxiesResourceApi res = new api.ComputeApi(mock).targetHttpsProxies;
+      api.TargetHttpsProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpsProxies;
       var arg_request = buildTargetHttpsProxiesSetSslCertificatesRequest();
       var arg_project = "foo";
       var arg_targetHttpsProxy = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(json);
+        var obj =
+            new api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(json);
         checkTargetHttpsProxiesSetSslCertificatesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24027,30 +25272,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setSslCertificates(arg_request, arg_project, arg_targetHttpsProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setSslCertificates(arg_request, arg_project, arg_targetHttpsProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setUrlMap", () {
-
       var mock = new HttpServerMock();
-      api.TargetHttpsProxiesResourceApi res = new api.ComputeApi(mock).targetHttpsProxies;
+      api.TargetHttpsProxiesResourceApi res =
+          new api.ComputeApi(mock).targetHttpsProxies;
       var arg_request = buildUrlMapReference();
       var arg_project = "foo";
       var arg_targetHttpsProxy = "foo";
@@ -24063,7 +25313,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24076,34 +25327,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setUrlMap(arg_request, arg_project, arg_targetHttpsProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setUrlMap(arg_request, arg_project, arg_targetHttpsProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetInstancesResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.TargetInstancesResourceApi res = new api.ComputeApi(mock).targetInstances;
+      api.TargetInstancesResourceApi res =
+          new api.ComputeApi(mock).targetInstances;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -24114,7 +25368,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24127,33 +25382,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetInstanceAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetInstanceAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.TargetInstanceAggregatedList response) {
         checkTargetInstanceAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TargetInstancesResourceApi res = new api.ComputeApi(mock).targetInstances;
+      api.TargetInstancesResourceApi res =
+          new api.ComputeApi(mock).targetInstances;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_targetInstance = "foo";
@@ -24163,7 +25429,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24176,30 +25443,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_targetInstance, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_zone, arg_targetInstance,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TargetInstancesResourceApi res = new api.ComputeApi(mock).targetInstances;
+      api.TargetInstancesResourceApi res =
+          new api.ComputeApi(mock).targetInstances;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_targetInstance = "foo";
@@ -24208,7 +25480,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24221,29 +25494,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetInstance());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_targetInstance).then(unittest.expectAsync1(((api.TargetInstance response) {
+      res
+          .get(arg_project, arg_zone, arg_targetInstance)
+          .then(unittest.expectAsync1(((api.TargetInstance response) {
         checkTargetInstance(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TargetInstancesResourceApi res = new api.ComputeApi(mock).targetInstances;
+      api.TargetInstancesResourceApi res =
+          new api.ComputeApi(mock).targetInstances;
       var arg_request = buildTargetInstance();
       var arg_project = "foo";
       var arg_zone = "foo";
@@ -24256,7 +25532,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24269,30 +25546,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_zone, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_zone, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TargetInstancesResourceApi res = new api.ComputeApi(mock).targetInstances;
+      api.TargetInstancesResourceApi res =
+          new api.ComputeApi(mock).targetInstances;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_filter = "foo";
@@ -24304,7 +25585,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24317,35 +25599,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetInstanceList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetInstanceList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetInstanceList response) {
         checkTargetInstanceList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetPoolsResourceApi", () {
     unittest.test("method--addHealthCheck", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildTargetPoolsAddHealthCheckRequest();
@@ -24361,7 +25650,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24374,28 +25664,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addHealthCheck(arg_request, arg_project, arg_region, arg_targetPool, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .addHealthCheck(arg_request, arg_project, arg_region, arg_targetPool,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--addInstance", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildTargetPoolsAddInstanceRequest();
@@ -24411,7 +25705,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24424,28 +25719,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addInstance(arg_request, arg_project, arg_region, arg_targetPool, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .addInstance(arg_request, arg_project, arg_region, arg_targetPool,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_project = "foo";
@@ -24458,7 +25757,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24471,31 +25771,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetPoolAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetPoolAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetPoolAggregatedList response) {
         checkTargetPoolAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_project = "foo";
@@ -24507,7 +25816,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24520,28 +25830,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_targetPool, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_targetPool,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_project = "foo";
@@ -24552,7 +25866,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24565,27 +25880,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetPool());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_targetPool).then(unittest.expectAsync1(((api.TargetPool response) {
+      res
+          .get(arg_project, arg_region, arg_targetPool)
+          .then(unittest.expectAsync1(((api.TargetPool response) {
         checkTargetPool(response);
       })));
     });
 
     unittest.test("method--getHealth", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildInstanceReference();
@@ -24600,7 +25917,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24613,27 +25931,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetPoolInstanceHealth());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getHealth(arg_request, arg_project, arg_region, arg_targetPool).then(unittest.expectAsync1(((api.TargetPoolInstanceHealth response) {
+      res
+          .getHealth(arg_request, arg_project, arg_region, arg_targetPool)
+          .then(unittest.expectAsync1(((api.TargetPoolInstanceHealth response) {
         checkTargetPoolInstanceHealth(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildTargetPool();
@@ -24648,7 +25968,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24661,28 +25982,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_project = "foo";
@@ -24696,7 +26021,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24709,31 +26035,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetPoolList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetPoolList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetPoolList response) {
         checkTargetPoolList(response);
       })));
     });
 
     unittest.test("method--removeHealthCheck", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildTargetPoolsRemoveHealthCheckRequest();
@@ -24749,7 +26084,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24762,28 +26098,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.removeHealthCheck(arg_request, arg_project, arg_region, arg_targetPool, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .removeHealthCheck(
+              arg_request, arg_project, arg_region, arg_targetPool,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--removeInstance", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildTargetPoolsRemoveInstanceRequest();
@@ -24799,7 +26140,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24812,28 +26154,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.removeInstance(arg_request, arg_project, arg_region, arg_targetPool, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .removeInstance(arg_request, arg_project, arg_region, arg_targetPool,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setBackup", () {
-
       var mock = new HttpServerMock();
       api.TargetPoolsResourceApi res = new api.ComputeApi(mock).targetPools;
       var arg_request = buildTargetReference();
@@ -24850,7 +26196,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24863,35 +26210,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.num.parse(queryMap["failoverRatio"].first), unittest.equals(arg_failoverRatio));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(core.num.parse(queryMap["failoverRatio"].first),
+            unittest.equals(arg_failoverRatio));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setBackup(arg_request, arg_project, arg_region, arg_targetPool, failoverRatio: arg_failoverRatio, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setBackup(arg_request, arg_project, arg_region, arg_targetPool,
+              failoverRatio: arg_failoverRatio, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetSslProxiesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_project = "foo";
       var arg_targetSslProxy = "foo";
       var arg_requestId = "foo";
@@ -24900,7 +26251,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24913,30 +26265,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_targetSslProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_targetSslProxy, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_project = "foo";
       var arg_targetSslProxy = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -24944,7 +26300,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -24957,29 +26314,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetSslProxy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_targetSslProxy).then(unittest.expectAsync1(((api.TargetSslProxy response) {
+      res
+          .get(arg_project, arg_targetSslProxy)
+          .then(unittest.expectAsync1(((api.TargetSslProxy response) {
         checkTargetSslProxy(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_request = buildTargetSslProxy();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -24991,7 +26351,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25004,30 +26365,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -25038,7 +26403,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25051,46 +26417,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetSslProxyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetSslProxyList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetSslProxyList response) {
         checkTargetSslProxyList(response);
       })));
     });
 
     unittest.test("method--setBackendService", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_request = buildTargetSslProxiesSetBackendServiceRequest();
       var arg_project = "foo";
       var arg_targetSslProxy = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.TargetSslProxiesSetBackendServiceRequest.fromJson(json);
+        var obj =
+            new api.TargetSslProxiesSetBackendServiceRequest.fromJson(json);
         checkTargetSslProxiesSetBackendServiceRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25103,30 +26481,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setBackendService(arg_request, arg_project, arg_targetSslProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setBackendService(arg_request, arg_project, arg_targetSslProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setProxyHeader", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_request = buildTargetSslProxiesSetProxyHeaderRequest();
       var arg_project = "foo";
       var arg_targetSslProxy = "foo";
@@ -25139,7 +26522,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25152,43 +26536,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setProxyHeader(arg_request, arg_project, arg_targetSslProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setProxyHeader(arg_request, arg_project, arg_targetSslProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setSslCertificates", () {
-
       var mock = new HttpServerMock();
-      api.TargetSslProxiesResourceApi res = new api.ComputeApi(mock).targetSslProxies;
+      api.TargetSslProxiesResourceApi res =
+          new api.ComputeApi(mock).targetSslProxies;
       var arg_request = buildTargetSslProxiesSetSslCertificatesRequest();
       var arg_project = "foo";
       var arg_targetSslProxy = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.TargetSslProxiesSetSslCertificatesRequest.fromJson(json);
+        var obj =
+            new api.TargetSslProxiesSetSslCertificatesRequest.fromJson(json);
         checkTargetSslProxiesSetSslCertificatesRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25201,34 +26592,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setSslCertificates(arg_request, arg_project, arg_targetSslProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setSslCertificates(arg_request, arg_project, arg_targetSslProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetTcpProxiesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TargetTcpProxiesResourceApi res = new api.ComputeApi(mock).targetTcpProxies;
+      api.TargetTcpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetTcpProxies;
       var arg_project = "foo";
       var arg_targetTcpProxy = "foo";
       var arg_requestId = "foo";
@@ -25237,7 +26631,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25250,30 +26645,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_targetTcpProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_targetTcpProxy, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TargetTcpProxiesResourceApi res = new api.ComputeApi(mock).targetTcpProxies;
+      api.TargetTcpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetTcpProxies;
       var arg_project = "foo";
       var arg_targetTcpProxy = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -25281,7 +26680,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25294,29 +26694,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetTcpProxy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_targetTcpProxy).then(unittest.expectAsync1(((api.TargetTcpProxy response) {
+      res
+          .get(arg_project, arg_targetTcpProxy)
+          .then(unittest.expectAsync1(((api.TargetTcpProxy response) {
         checkTargetTcpProxy(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TargetTcpProxiesResourceApi res = new api.ComputeApi(mock).targetTcpProxies;
+      api.TargetTcpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetTcpProxies;
       var arg_request = buildTargetTcpProxy();
       var arg_project = "foo";
       var arg_requestId = "foo";
@@ -25328,7 +26731,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25341,30 +26745,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TargetTcpProxiesResourceApi res = new api.ComputeApi(mock).targetTcpProxies;
+      api.TargetTcpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetTcpProxies;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -25375,7 +26783,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25388,46 +26797,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetTcpProxyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetTcpProxyList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetTcpProxyList response) {
         checkTargetTcpProxyList(response);
       })));
     });
 
     unittest.test("method--setBackendService", () {
-
       var mock = new HttpServerMock();
-      api.TargetTcpProxiesResourceApi res = new api.ComputeApi(mock).targetTcpProxies;
+      api.TargetTcpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetTcpProxies;
       var arg_request = buildTargetTcpProxiesSetBackendServiceRequest();
       var arg_project = "foo";
       var arg_targetTcpProxy = "foo";
       var arg_requestId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.TargetTcpProxiesSetBackendServiceRequest.fromJson(json);
+        var obj =
+            new api.TargetTcpProxiesSetBackendServiceRequest.fromJson(json);
         checkTargetTcpProxiesSetBackendServiceRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25440,30 +26861,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setBackendService(arg_request, arg_project, arg_targetTcpProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setBackendService(arg_request, arg_project, arg_targetTcpProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setProxyHeader", () {
-
       var mock = new HttpServerMock();
-      api.TargetTcpProxiesResourceApi res = new api.ComputeApi(mock).targetTcpProxies;
+      api.TargetTcpProxiesResourceApi res =
+          new api.ComputeApi(mock).targetTcpProxies;
       var arg_request = buildTargetTcpProxiesSetProxyHeaderRequest();
       var arg_project = "foo";
       var arg_targetTcpProxy = "foo";
@@ -25476,7 +26902,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25489,34 +26916,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setProxyHeader(arg_request, arg_project, arg_targetTcpProxy, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setProxyHeader(arg_request, arg_project, arg_targetTcpProxy,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TargetVpnGatewaysResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
-      api.TargetVpnGatewaysResourceApi res = new api.ComputeApi(mock).targetVpnGateways;
+      api.TargetVpnGatewaysResourceApi res =
+          new api.ComputeApi(mock).targetVpnGateways;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -25527,7 +26957,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25540,33 +26971,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetVpnGatewayAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetVpnGatewayAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.TargetVpnGatewayAggregatedList response) {
         checkTargetVpnGatewayAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TargetVpnGatewaysResourceApi res = new api.ComputeApi(mock).targetVpnGateways;
+      api.TargetVpnGatewaysResourceApi res =
+          new api.ComputeApi(mock).targetVpnGateways;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_targetVpnGateway = "foo";
@@ -25576,7 +27018,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25589,30 +27032,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_targetVpnGateway, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_targetVpnGateway,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TargetVpnGatewaysResourceApi res = new api.ComputeApi(mock).targetVpnGateways;
+      api.TargetVpnGatewaysResourceApi res =
+          new api.ComputeApi(mock).targetVpnGateways;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_targetVpnGateway = "foo";
@@ -25621,7 +27069,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25634,29 +27083,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetVpnGateway());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_targetVpnGateway).then(unittest.expectAsync1(((api.TargetVpnGateway response) {
+      res
+          .get(arg_project, arg_region, arg_targetVpnGateway)
+          .then(unittest.expectAsync1(((api.TargetVpnGateway response) {
         checkTargetVpnGateway(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TargetVpnGatewaysResourceApi res = new api.ComputeApi(mock).targetVpnGateways;
+      api.TargetVpnGatewaysResourceApi res =
+          new api.ComputeApi(mock).targetVpnGateways;
       var arg_request = buildTargetVpnGateway();
       var arg_project = "foo";
       var arg_region = "foo";
@@ -25669,7 +27121,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25682,30 +27135,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TargetVpnGatewaysResourceApi res = new api.ComputeApi(mock).targetVpnGateways;
+      api.TargetVpnGatewaysResourceApi res =
+          new api.ComputeApi(mock).targetVpnGateways;
       var arg_project = "foo";
       var arg_region = "foo";
       var arg_filter = "foo";
@@ -25717,7 +27175,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25730,35 +27189,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTargetVpnGatewayList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TargetVpnGatewayList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TargetVpnGatewayList response) {
         checkTargetVpnGatewayList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UrlMapsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_project = "foo";
@@ -25769,7 +27235,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25782,28 +27249,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_urlMap, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_urlMap, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_project = "foo";
@@ -25813,7 +27283,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25826,27 +27297,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrlMap());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_urlMap).then(unittest.expectAsync1(((api.UrlMap response) {
+      res
+          .get(arg_project, arg_urlMap)
+          .then(unittest.expectAsync1(((api.UrlMap response) {
         checkUrlMap(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_request = buildUrlMap();
@@ -25860,7 +27333,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25873,28 +27347,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--invalidateCache", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_request = buildCacheInvalidationRule();
@@ -25909,7 +27386,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25922,28 +27400,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.invalidateCache(arg_request, arg_project, arg_urlMap, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .invalidateCache(arg_request, arg_project, arg_urlMap,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_project = "foo";
@@ -25956,7 +27438,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -25969,31 +27452,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrlMapList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.UrlMapList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.UrlMapList response) {
         checkUrlMapList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_request = buildUrlMap();
@@ -26008,7 +27500,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26021,28 +27514,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_urlMap, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_urlMap, requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_request = buildUrlMap();
@@ -26057,7 +27553,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26070,28 +27567,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_urlMap, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_urlMap,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--validate", () {
-
       var mock = new HttpServerMock();
       api.UrlMapsResourceApi res = new api.ComputeApi(mock).urlMaps;
       var arg_request = buildUrlMapsValidateRequest();
@@ -26105,7 +27606,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26118,31 +27620,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrlMapsValidateResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.validate(arg_request, arg_project, arg_urlMap).then(unittest.expectAsync1(((api.UrlMapsValidateResponse response) {
+      res
+          .validate(arg_request, arg_project, arg_urlMap)
+          .then(unittest.expectAsync1(((api.UrlMapsValidateResponse response) {
         checkUrlMapsValidateResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VpnTunnelsResourceApi", () {
     unittest.test("method--aggregatedList", () {
-
       var mock = new HttpServerMock();
       api.VpnTunnelsResourceApi res = new api.ComputeApi(mock).vpnTunnels;
       var arg_project = "foo";
@@ -26155,7 +27657,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26168,31 +27671,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVpnTunnelAggregatedList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.aggregatedList(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.VpnTunnelAggregatedList response) {
+      res
+          .aggregatedList(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.VpnTunnelAggregatedList response) {
         checkVpnTunnelAggregatedList(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.VpnTunnelsResourceApi res = new api.ComputeApi(mock).vpnTunnels;
       var arg_project = "foo";
@@ -26204,7 +27716,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26217,28 +27730,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_region, arg_vpnTunnel, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_region, arg_vpnTunnel,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.VpnTunnelsResourceApi res = new api.ComputeApi(mock).vpnTunnels;
       var arg_project = "foo";
@@ -26249,7 +27766,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26262,27 +27780,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVpnTunnel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_region, arg_vpnTunnel).then(unittest.expectAsync1(((api.VpnTunnel response) {
+      res
+          .get(arg_project, arg_region, arg_vpnTunnel)
+          .then(unittest.expectAsync1(((api.VpnTunnel response) {
         checkVpnTunnel(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.VpnTunnelsResourceApi res = new api.ComputeApi(mock).vpnTunnels;
       var arg_request = buildVpnTunnel();
@@ -26297,7 +27817,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26310,28 +27831,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, arg_region, requestId: arg_requestId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, arg_region,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.VpnTunnelsResourceApi res = new api.ComputeApi(mock).vpnTunnels;
       var arg_project = "foo";
@@ -26345,7 +27870,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26358,37 +27884,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVpnTunnelList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_region, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.VpnTunnelList response) {
+      res
+          .list(arg_project, arg_region,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.VpnTunnelList response) {
         checkVpnTunnelList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ZoneOperationsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ZoneOperationsResourceApi res = new api.ComputeApi(mock).zoneOperations;
+      api.ZoneOperationsResourceApi res =
+          new api.ComputeApi(mock).zoneOperations;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_operation = "foo";
@@ -26397,7 +27931,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26410,27 +27945,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_zone, arg_operation).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_project, arg_zone, arg_operation)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ZoneOperationsResourceApi res = new api.ComputeApi(mock).zoneOperations;
+      api.ZoneOperationsResourceApi res =
+          new api.ComputeApi(mock).zoneOperations;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_operation = "foo";
@@ -26439,7 +27977,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26452,29 +27991,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone, arg_operation).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .get(arg_project, arg_zone, arg_operation)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ZoneOperationsResourceApi res = new api.ComputeApi(mock).zoneOperations;
+      api.ZoneOperationsResourceApi res =
+          new api.ComputeApi(mock).zoneOperations;
       var arg_project = "foo";
       var arg_zone = "foo";
       var arg_filter = "foo";
@@ -26486,7 +28028,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26499,35 +28042,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperationList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.OperationList response) {
+      res
+          .list(arg_project, arg_zone,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.OperationList response) {
         checkOperationList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ZonesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ZonesResourceApi res = new api.ComputeApi(mock).zones;
       var arg_project = "foo";
@@ -26537,7 +28087,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26550,27 +28101,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildZone());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_zone).then(unittest.expectAsync1(((api.Zone response) {
+      res
+          .get(arg_project, arg_zone)
+          .then(unittest.expectAsync1(((api.Zone response) {
         checkZone(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ZonesResourceApi res = new api.ComputeApi(mock).zones;
       var arg_project = "foo";
@@ -26583,7 +28136,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -26596,31 +28150,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildZoneList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ZoneList response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ZoneList response) {
         checkZoneList(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/consumersurveys/v2_test.dart b/generated/googleapis/test/consumersurveys/v2_test.dart
index e4d838f..c7e41c6 100644
--- a/generated/googleapis/test/consumersurveys/v2_test.dart
+++ b/generated/googleapis/test/consumersurveys/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.consumersurveys.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/consumersurveys/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed75() {
+buildUnnamed70() {
   var o = new core.List<api.FieldMask>();
   o.add(buildFieldMask());
   o.add(buildFieldMask());
   return o;
 }
 
-checkUnnamed75(core.List<api.FieldMask> o) {
+checkUnnamed70(core.List<api.FieldMask> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFieldMask(o[0]);
   checkFieldMask(o[1]);
@@ -69,7 +68,7 @@
   var o = new api.FieldMask();
   buildCounterFieldMask++;
   if (buildCounterFieldMask < 3) {
-    o.fields = buildUnnamed75();
+    o.fields = buildUnnamed70();
     o.id = 42;
   }
   buildCounterFieldMask--;
@@ -79,20 +78,20 @@
 checkFieldMask(api.FieldMask o) {
   buildCounterFieldMask++;
   if (buildCounterFieldMask < 3) {
-    checkUnnamed75(o.fields);
+    checkUnnamed70(o.fields);
     unittest.expect(o.id, unittest.equals(42));
   }
   buildCounterFieldMask--;
 }
 
-buildUnnamed76() {
+buildUnnamed71() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed76(core.List<core.String> o) {
+checkUnnamed71(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -108,7 +107,7 @@
     o.language = "foo";
     o.mobileAppPanelId = "foo";
     o.name = "foo";
-    o.owners = buildUnnamed76();
+    o.owners = buildUnnamed71();
   }
   buildCounterMobileAppPanel--;
   return o;
@@ -122,19 +121,19 @@
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed76(o.owners);
+    checkUnnamed71(o.owners);
   }
   buildCounterMobileAppPanel--;
 }
 
-buildUnnamed77() {
+buildUnnamed72() {
   var o = new core.List<api.MobileAppPanel>();
   o.add(buildMobileAppPanel());
   o.add(buildMobileAppPanel());
   return o;
 }
 
-checkUnnamed77(core.List<api.MobileAppPanel> o) {
+checkUnnamed72(core.List<api.MobileAppPanel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileAppPanel(o[0]);
   checkMobileAppPanel(o[1]);
@@ -147,7 +146,7 @@
   if (buildCounterMobileAppPanelsListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.requestId = "foo";
-    o.resources = buildUnnamed77();
+    o.resources = buildUnnamed72();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterMobileAppPanelsListResponse--;
@@ -159,7 +158,7 @@
   if (buildCounterMobileAppPanelsListResponse < 3) {
     checkPageInfo(o.pageInfo);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed77(o.resources);
+    checkUnnamed72(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterMobileAppPanelsListResponse--;
@@ -207,14 +206,14 @@
   buildCounterResultsGetRequest--;
 }
 
-buildUnnamed78() {
+buildUnnamed73() {
   var o = new core.List<api.FieldMask>();
   o.add(buildFieldMask());
   o.add(buildFieldMask());
   return o;
 }
 
-checkUnnamed78(core.List<api.FieldMask> o) {
+checkUnnamed73(core.List<api.FieldMask> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFieldMask(o[0]);
   checkFieldMask(o[1]);
@@ -225,7 +224,7 @@
   var o = new api.ResultsMask();
   buildCounterResultsMask++;
   if (buildCounterResultsMask < 3) {
-    o.fields = buildUnnamed78();
+    o.fields = buildUnnamed73();
     o.projection = "foo";
   }
   buildCounterResultsMask--;
@@ -235,33 +234,33 @@
 checkResultsMask(api.ResultsMask o) {
   buildCounterResultsMask++;
   if (buildCounterResultsMask < 3) {
-    checkUnnamed78(o.fields);
+    checkUnnamed73(o.fields);
     unittest.expect(o.projection, unittest.equals('foo'));
   }
   buildCounterResultsMask--;
 }
 
-buildUnnamed79() {
+buildUnnamed74() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed79(core.List<core.String> o) {
+checkUnnamed74(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed80() {
+buildUnnamed75() {
   var o = new core.List<api.SurveyQuestion>();
   o.add(buildSurveyQuestion());
   o.add(buildSurveyQuestion());
   return o;
 }
 
-checkUnnamed80(core.List<api.SurveyQuestion> o) {
+checkUnnamed75(core.List<api.SurveyQuestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurveyQuestion(o[0]);
   checkSurveyQuestion(o[1]);
@@ -276,8 +275,8 @@
     o.cost = buildSurveyCost();
     o.customerData = "foo";
     o.description = "foo";
-    o.owners = buildUnnamed79();
-    o.questions = buildUnnamed80();
+    o.owners = buildUnnamed74();
+    o.questions = buildUnnamed75();
     o.rejectionReason = buildSurveyRejection();
     o.state = "foo";
     o.surveyUrlId = "foo";
@@ -295,8 +294,8 @@
     checkSurveyCost(o.cost);
     unittest.expect(o.customerData, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed79(o.owners);
-    checkUnnamed80(o.questions);
+    checkUnnamed74(o.owners);
+    checkUnnamed75(o.questions);
     checkSurveyRejection(o.rejectionReason);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.surveyUrlId, unittest.equals('foo'));
@@ -306,27 +305,27 @@
   buildCounterSurvey--;
 }
 
-buildUnnamed81() {
+buildUnnamed76() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed81(core.List<core.String> o) {
+checkUnnamed76(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed82() {
+buildUnnamed77() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed82(core.List<core.String> o) {
+checkUnnamed77(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -337,11 +336,11 @@
   var o = new api.SurveyAudience();
   buildCounterSurveyAudience++;
   if (buildCounterSurveyAudience < 3) {
-    o.ages = buildUnnamed81();
+    o.ages = buildUnnamed76();
     o.country = "foo";
     o.countrySubdivision = "foo";
     o.gender = "foo";
-    o.languages = buildUnnamed82();
+    o.languages = buildUnnamed77();
     o.mobileAppPanelId = "foo";
     o.populationSource = "foo";
   }
@@ -352,11 +351,11 @@
 checkSurveyAudience(api.SurveyAudience o) {
   buildCounterSurveyAudience++;
   if (buildCounterSurveyAudience < 3) {
-    checkUnnamed81(o.ages);
+    checkUnnamed76(o.ages);
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.countrySubdivision, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
-    checkUnnamed82(o.languages);
+    checkUnnamed77(o.languages);
     unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
     unittest.expect(o.populationSource, unittest.equals('foo'));
   }
@@ -388,53 +387,53 @@
   buildCounterSurveyCost--;
 }
 
-buildUnnamed83() {
+buildUnnamed78() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed83(core.List<core.String> o) {
+checkUnnamed78(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed84() {
+buildUnnamed79() {
   var o = new core.List<api.SurveyQuestionImage>();
   o.add(buildSurveyQuestionImage());
   o.add(buildSurveyQuestionImage());
   return o;
 }
 
-checkUnnamed84(core.List<api.SurveyQuestionImage> o) {
+checkUnnamed79(core.List<api.SurveyQuestionImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurveyQuestionImage(o[0]);
   checkSurveyQuestionImage(o[1]);
 }
 
-buildUnnamed85() {
+buildUnnamed80() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed85(core.List<core.String> o) {
+checkUnnamed80(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed86() {
+buildUnnamed81() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed86(core.List<core.String> o) {
+checkUnnamed81(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -446,20 +445,20 @@
   buildCounterSurveyQuestion++;
   if (buildCounterSurveyQuestion < 3) {
     o.answerOrder = "foo";
-    o.answers = buildUnnamed83();
+    o.answers = buildUnnamed78();
     o.hasOther = true;
     o.highValueLabel = "foo";
-    o.images = buildUnnamed84();
+    o.images = buildUnnamed79();
     o.lastAnswerPositionPinned = true;
     o.lowValueLabel = "foo";
     o.mustPickSuggestion = true;
     o.numStars = "foo";
     o.openTextPlaceholder = "foo";
-    o.openTextSuggestions = buildUnnamed85();
+    o.openTextSuggestions = buildUnnamed80();
     o.question = "foo";
     o.sentimentText = "foo";
     o.singleLineResponse = true;
-    o.thresholdAnswers = buildUnnamed86();
+    o.thresholdAnswers = buildUnnamed81();
     o.type = "foo";
     o.unitOfMeasurementLabel = "foo";
     o.videoId = "foo";
@@ -472,20 +471,20 @@
   buildCounterSurveyQuestion++;
   if (buildCounterSurveyQuestion < 3) {
     unittest.expect(o.answerOrder, unittest.equals('foo'));
-    checkUnnamed83(o.answers);
+    checkUnnamed78(o.answers);
     unittest.expect(o.hasOther, unittest.isTrue);
     unittest.expect(o.highValueLabel, unittest.equals('foo'));
-    checkUnnamed84(o.images);
+    checkUnnamed79(o.images);
     unittest.expect(o.lastAnswerPositionPinned, unittest.isTrue);
     unittest.expect(o.lowValueLabel, unittest.equals('foo'));
     unittest.expect(o.mustPickSuggestion, unittest.isTrue);
     unittest.expect(o.numStars, unittest.equals('foo'));
     unittest.expect(o.openTextPlaceholder, unittest.equals('foo'));
-    checkUnnamed85(o.openTextSuggestions);
+    checkUnnamed80(o.openTextSuggestions);
     unittest.expect(o.question, unittest.equals('foo'));
     unittest.expect(o.sentimentText, unittest.equals('foo'));
     unittest.expect(o.singleLineResponse, unittest.isTrue);
-    checkUnnamed86(o.thresholdAnswers);
+    checkUnnamed81(o.thresholdAnswers);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unitOfMeasurementLabel, unittest.equals('foo'));
     unittest.expect(o.videoId, unittest.equals('foo'));
@@ -577,14 +576,14 @@
   buildCounterSurveysDeleteResponse--;
 }
 
-buildUnnamed87() {
+buildUnnamed82() {
   var o = new core.List<api.Survey>();
   o.add(buildSurvey());
   o.add(buildSurvey());
   return o;
 }
 
-checkUnnamed87(core.List<api.Survey> o) {
+checkUnnamed82(core.List<api.Survey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurvey(o[0]);
   checkSurvey(o[1]);
@@ -597,7 +596,7 @@
   if (buildCounterSurveysListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.requestId = "foo";
-    o.resources = buildUnnamed87();
+    o.resources = buildUnnamed82();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterSurveysListResponse--;
@@ -609,7 +608,7 @@
   if (buildCounterSurveysListResponse < 3) {
     checkPageInfo(o.pageInfo);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed87(o.resources);
+    checkUnnamed82(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterSurveysListResponse--;
@@ -693,7 +692,6 @@
   buildCounterTokenPagination--;
 }
 
-
 main() {
   unittest.group("obj-schema-FieldMask", () {
     unittest.test("to-json--from-json", () {
@@ -703,7 +701,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileAppPanel", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileAppPanel();
@@ -712,7 +709,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileAppPanelsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileAppPanelsListResponse();
@@ -721,7 +717,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageInfo();
@@ -730,7 +725,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultsGetRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultsGetRequest();
@@ -739,7 +733,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultsMask", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultsMask();
@@ -748,7 +741,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Survey", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurvey();
@@ -757,7 +749,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyAudience", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyAudience();
@@ -766,7 +757,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyCost", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyCost();
@@ -775,7 +765,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyQuestion", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyQuestion();
@@ -784,7 +773,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyQuestionImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyQuestionImage();
@@ -793,7 +781,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyRejection", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyRejection();
@@ -802,7 +789,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyResults", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyResults();
@@ -811,7 +797,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysDeleteResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysDeleteResponse();
@@ -820,7 +805,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysListResponse();
@@ -829,7 +813,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysStartRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysStartRequest();
@@ -838,7 +821,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysStartResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysStartResponse();
@@ -847,7 +829,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysStopResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysStopResponse();
@@ -856,7 +837,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TokenPagination", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokenPagination();
@@ -865,23 +845,25 @@
     });
   });
 
-
   unittest.group("resource-MobileapppanelsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res = new api.ConsumersurveysApi(mock).mobileapppanels;
+      api.MobileapppanelsResourceApi res =
+          new api.ConsumersurveysApi(mock).mobileapppanels;
       var arg_panelId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("mobileAppPanels/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("mobileAppPanels/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -897,29 +879,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileAppPanel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_panelId).then(unittest.expectAsync1(((api.MobileAppPanel response) {
+      res
+          .get(arg_panelId)
+          .then(unittest.expectAsync1(((api.MobileAppPanel response) {
         checkMobileAppPanel(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res = new api.ConsumersurveysApi(mock).mobileapppanels;
+      api.MobileapppanelsResourceApi res =
+          new api.ConsumersurveysApi(mock).mobileapppanels;
       var arg_maxResults = 42;
       var arg_startIndex = 42;
       var arg_token = "foo";
@@ -928,11 +913,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("mobileAppPanels"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("mobileAppPanels"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -945,32 +933,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileAppPanelsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, startIndex: arg_startIndex, token: arg_token).then(unittest.expectAsync1(((api.MobileAppPanelsListResponse response) {
+      res
+          .list(
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              token: arg_token)
+          .then(unittest
+              .expectAsync1(((api.MobileAppPanelsListResponse response) {
         checkMobileAppPanelsListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res = new api.ConsumersurveysApi(mock).mobileapppanels;
+      api.MobileapppanelsResourceApi res =
+          new api.ConsumersurveysApi(mock).mobileapppanels;
       var arg_request = buildMobileAppPanel();
       var arg_panelId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -981,11 +978,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("mobileAppPanels/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("mobileAppPanels/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1001,28 +1001,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileAppPanel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_panelId).then(unittest.expectAsync1(((api.MobileAppPanel response) {
+      res
+          .update(arg_request, arg_panelId)
+          .then(unittest.expectAsync1(((api.MobileAppPanel response) {
         checkMobileAppPanel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ResultsResourceApi", () {
     unittest.test("method--get", () {
       // TODO: Implement tests for media upload;
@@ -1040,18 +1041,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         index = path.indexOf("/results", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_surveyUrlId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/results"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/results"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1064,31 +1070,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveyResults());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_request, arg_surveyUrlId).then(unittest.expectAsync1(((api.SurveyResults response) {
+      res
+          .get(arg_request, arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.SurveyResults response) {
         checkSurveyResults(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SurveysResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_surveyUrlId = "foo";
@@ -1097,11 +1103,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1117,27 +1126,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysDeleteResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_surveyUrlId).then(unittest.expectAsync1(((api.SurveysDeleteResponse response) {
+      res
+          .delete(arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.SurveysDeleteResponse response) {
         checkSurveysDeleteResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_surveyUrlId = "foo";
@@ -1146,11 +1157,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1166,27 +1180,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurvey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_surveyUrlId).then(unittest.expectAsync1(((api.Survey response) {
+      res
+          .get(arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.Survey response) {
         checkSurvey(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_request = buildSurvey();
@@ -1198,11 +1214,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("surveys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("surveys"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1215,27 +1234,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurvey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.Survey response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.Survey response) {
         checkSurvey(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_maxResults = 42;
@@ -1246,11 +1267,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("surveys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("surveys"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1263,30 +1287,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, startIndex: arg_startIndex, token: arg_token).then(unittest.expectAsync1(((api.SurveysListResponse response) {
+      res
+          .list(
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              token: arg_token)
+          .then(unittest.expectAsync1(((api.SurveysListResponse response) {
         checkSurveysListResponse(response);
       })));
     });
 
     unittest.test("method--start", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_request = buildSurveysStartRequest();
@@ -1299,18 +1330,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         index = path.indexOf("/start", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/start"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/start"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1323,27 +1359,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysStartResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.start(arg_request, arg_resourceId).then(unittest.expectAsync1(((api.SurveysStartResponse response) {
+      res
+          .start(arg_request, arg_resourceId)
+          .then(unittest.expectAsync1(((api.SurveysStartResponse response) {
         checkSurveysStartResponse(response);
       })));
     });
 
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_resourceId = "foo";
@@ -1352,18 +1390,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         index = path.indexOf("/stop", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/stop"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/stop"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1376,27 +1419,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysStopResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.stop(arg_resourceId).then(unittest.expectAsync1(((api.SurveysStopResponse response) {
+      res
+          .stop(arg_resourceId)
+          .then(unittest.expectAsync1(((api.SurveysStopResponse response) {
         checkSurveysStopResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.ConsumersurveysApi(mock).surveys;
       var arg_request = buildSurvey();
@@ -1409,11 +1454,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("consumersurveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("consumersurveys/v2/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1429,27 +1477,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurvey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_surveyUrlId).then(unittest.expectAsync1(((api.Survey response) {
+      res
+          .update(arg_request, arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.Survey response) {
         checkSurvey(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/container/v1_test.dart b/generated/googleapis/test/container/v1_test.dart
index d9b06b5..e1555a7 100644
--- a/generated/googleapis/test/container/v1_test.dart
+++ b/generated/googleapis/test/container/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.container.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/container/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -120,16 +119,14 @@
 buildCancelOperationRequest() {
   var o = new api.CancelOperationRequest();
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
   return o;
 }
 
 checkCancelOperationRequest(api.CancelOperationRequest o) {
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
 }
 
@@ -173,53 +170,53 @@
   buildCounterClientCertificateConfig--;
 }
 
+buildUnnamed1862() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1862(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1863() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1863(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed1864() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1864(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1865() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1865(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1866() {
   var o = new core.List<api.NodePool>();
   o.add(buildNodePool());
   o.add(buildNodePool());
   return o;
 }
 
-checkUnnamed1866(core.List<api.NodePool> o) {
+checkUnnamed1864(core.List<api.NodePool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNodePool(o[0]);
   checkNodePool(o[1]);
 }
 
-buildUnnamed1867() {
+buildUnnamed1865() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1867(core.Map<core.String, core.String> o) {
+checkUnnamed1865(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -242,11 +239,11 @@
     o.expireTime = "foo";
     o.initialClusterVersion = "foo";
     o.initialNodeCount = 42;
-    o.instanceGroupUrls = buildUnnamed1864();
+    o.instanceGroupUrls = buildUnnamed1862();
     o.ipAllocationPolicy = buildIPAllocationPolicy();
     o.labelFingerprint = "foo";
     o.legacyAbac = buildLegacyAbac();
-    o.locations = buildUnnamed1865();
+    o.locations = buildUnnamed1863();
     o.loggingService = "foo";
     o.masterAuth = buildMasterAuth();
     o.masterAuthorizedNetworksConfig = buildMasterAuthorizedNetworksConfig();
@@ -256,8 +253,8 @@
     o.networkPolicy = buildNetworkPolicy();
     o.nodeConfig = buildNodeConfig();
     o.nodeIpv4CidrSize = 42;
-    o.nodePools = buildUnnamed1866();
-    o.resourceLabels = buildUnnamed1867();
+    o.nodePools = buildUnnamed1864();
+    o.resourceLabels = buildUnnamed1865();
     o.selfLink = "foo";
     o.servicesIpv4Cidr = "foo";
     o.status = "foo";
@@ -284,11 +281,11 @@
     unittest.expect(o.expireTime, unittest.equals('foo'));
     unittest.expect(o.initialClusterVersion, unittest.equals('foo'));
     unittest.expect(o.initialNodeCount, unittest.equals(42));
-    checkUnnamed1864(o.instanceGroupUrls);
+    checkUnnamed1862(o.instanceGroupUrls);
     checkIPAllocationPolicy(o.ipAllocationPolicy);
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
     checkLegacyAbac(o.legacyAbac);
-    checkUnnamed1865(o.locations);
+    checkUnnamed1863(o.locations);
     unittest.expect(o.loggingService, unittest.equals('foo'));
     checkMasterAuth(o.masterAuth);
     checkMasterAuthorizedNetworksConfig(o.masterAuthorizedNetworksConfig);
@@ -298,8 +295,8 @@
     checkNetworkPolicy(o.networkPolicy);
     checkNodeConfig(o.nodeConfig);
     unittest.expect(o.nodeIpv4CidrSize, unittest.equals(42));
-    checkUnnamed1866(o.nodePools);
-    checkUnnamed1867(o.resourceLabels);
+    checkUnnamed1864(o.nodePools);
+    checkUnnamed1865(o.resourceLabels);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.servicesIpv4Cidr, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -310,14 +307,14 @@
   buildCounterCluster--;
 }
 
-buildUnnamed1868() {
+buildUnnamed1866() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1868(core.List<core.String> o) {
+checkUnnamed1866(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -330,8 +327,9 @@
   if (buildCounterClusterUpdate < 3) {
     o.desiredAddonsConfig = buildAddonsConfig();
     o.desiredImageType = "foo";
-    o.desiredLocations = buildUnnamed1868();
-    o.desiredMasterAuthorizedNetworksConfig = buildMasterAuthorizedNetworksConfig();
+    o.desiredLocations = buildUnnamed1866();
+    o.desiredMasterAuthorizedNetworksConfig =
+        buildMasterAuthorizedNetworksConfig();
     o.desiredMasterVersion = "foo";
     o.desiredMonitoringService = "foo";
     o.desiredNodePoolAutoscaling = buildNodePoolAutoscaling();
@@ -347,8 +345,9 @@
   if (buildCounterClusterUpdate < 3) {
     checkAddonsConfig(o.desiredAddonsConfig);
     unittest.expect(o.desiredImageType, unittest.equals('foo'));
-    checkUnnamed1868(o.desiredLocations);
-    checkMasterAuthorizedNetworksConfig(o.desiredMasterAuthorizedNetworksConfig);
+    checkUnnamed1866(o.desiredLocations);
+    checkMasterAuthorizedNetworksConfig(
+        o.desiredMasterAuthorizedNetworksConfig);
     unittest.expect(o.desiredMasterVersion, unittest.equals('foo'));
     unittest.expect(o.desiredMonitoringService, unittest.equals('foo'));
     checkNodePoolAutoscaling(o.desiredNodePoolAutoscaling);
@@ -362,16 +361,14 @@
 buildCompleteIPRotationRequest() {
   var o = new api.CompleteIPRotationRequest();
   buildCounterCompleteIPRotationRequest++;
-  if (buildCounterCompleteIPRotationRequest < 3) {
-  }
+  if (buildCounterCompleteIPRotationRequest < 3) {}
   buildCounterCompleteIPRotationRequest--;
   return o;
 }
 
 checkCompleteIPRotationRequest(api.CompleteIPRotationRequest o) {
   buildCounterCompleteIPRotationRequest++;
-  if (buildCounterCompleteIPRotationRequest < 3) {
-  }
+  if (buildCounterCompleteIPRotationRequest < 3) {}
   buildCounterCompleteIPRotationRequest--;
 }
 
@@ -417,16 +414,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -474,9 +469,14 @@
   buildCounterIPAllocationPolicy++;
   if (buildCounterIPAllocationPolicy < 3) {
     o.clusterIpv4Cidr = "foo";
+    o.clusterIpv4CidrBlock = "foo";
+    o.clusterSecondaryRangeName = "foo";
     o.createSubnetwork = true;
     o.nodeIpv4Cidr = "foo";
+    o.nodeIpv4CidrBlock = "foo";
     o.servicesIpv4Cidr = "foo";
+    o.servicesIpv4CidrBlock = "foo";
+    o.servicesSecondaryRangeName = "foo";
     o.subnetworkName = "foo";
     o.useIpAliases = true;
   }
@@ -488,9 +488,14 @@
   buildCounterIPAllocationPolicy++;
   if (buildCounterIPAllocationPolicy < 3) {
     unittest.expect(o.clusterIpv4Cidr, unittest.equals('foo'));
+    unittest.expect(o.clusterIpv4CidrBlock, unittest.equals('foo'));
+    unittest.expect(o.clusterSecondaryRangeName, unittest.equals('foo'));
     unittest.expect(o.createSubnetwork, unittest.isTrue);
     unittest.expect(o.nodeIpv4Cidr, unittest.equals('foo'));
+    unittest.expect(o.nodeIpv4CidrBlock, unittest.equals('foo'));
     unittest.expect(o.servicesIpv4Cidr, unittest.equals('foo'));
+    unittest.expect(o.servicesIpv4CidrBlock, unittest.equals('foo'));
+    unittest.expect(o.servicesSecondaryRangeName, unittest.equals('foo'));
     unittest.expect(o.subnetworkName, unittest.equals('foo'));
     unittest.expect(o.useIpAliases, unittest.isTrue);
   }
@@ -535,19 +540,85 @@
   buildCounterLegacyAbac--;
 }
 
-buildUnnamed1869() {
+buildUnnamed1867() {
   var o = new core.List<api.Cluster>();
   o.add(buildCluster());
   o.add(buildCluster());
   return o;
 }
 
-checkUnnamed1869(core.List<api.Cluster> o) {
+checkUnnamed1867(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCluster(o[0]);
   checkCluster(o[1]);
 }
 
+buildUnnamed1868() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1868(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterListClustersResponse = 0;
+buildListClustersResponse() {
+  var o = new api.ListClustersResponse();
+  buildCounterListClustersResponse++;
+  if (buildCounterListClustersResponse < 3) {
+    o.clusters = buildUnnamed1867();
+    o.missingZones = buildUnnamed1868();
+  }
+  buildCounterListClustersResponse--;
+  return o;
+}
+
+checkListClustersResponse(api.ListClustersResponse o) {
+  buildCounterListClustersResponse++;
+  if (buildCounterListClustersResponse < 3) {
+    checkUnnamed1867(o.clusters);
+    checkUnnamed1868(o.missingZones);
+  }
+  buildCounterListClustersResponse--;
+}
+
+buildUnnamed1869() {
+  var o = new core.List<api.NodePool>();
+  o.add(buildNodePool());
+  o.add(buildNodePool());
+  return o;
+}
+
+checkUnnamed1869(core.List<api.NodePool> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkNodePool(o[0]);
+  checkNodePool(o[1]);
+}
+
+core.int buildCounterListNodePoolsResponse = 0;
+buildListNodePoolsResponse() {
+  var o = new api.ListNodePoolsResponse();
+  buildCounterListNodePoolsResponse++;
+  if (buildCounterListNodePoolsResponse < 3) {
+    o.nodePools = buildUnnamed1869();
+  }
+  buildCounterListNodePoolsResponse--;
+  return o;
+}
+
+checkListNodePoolsResponse(api.ListNodePoolsResponse o) {
+  buildCounterListNodePoolsResponse++;
+  if (buildCounterListNodePoolsResponse < 3) {
+    checkUnnamed1869(o.nodePools);
+  }
+  buildCounterListNodePoolsResponse--;
+}
+
 buildUnnamed1870() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -561,80 +632,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterListClustersResponse = 0;
-buildListClustersResponse() {
-  var o = new api.ListClustersResponse();
-  buildCounterListClustersResponse++;
-  if (buildCounterListClustersResponse < 3) {
-    o.clusters = buildUnnamed1869();
-    o.missingZones = buildUnnamed1870();
-  }
-  buildCounterListClustersResponse--;
-  return o;
-}
-
-checkListClustersResponse(api.ListClustersResponse o) {
-  buildCounterListClustersResponse++;
-  if (buildCounterListClustersResponse < 3) {
-    checkUnnamed1869(o.clusters);
-    checkUnnamed1870(o.missingZones);
-  }
-  buildCounterListClustersResponse--;
-}
-
 buildUnnamed1871() {
-  var o = new core.List<api.NodePool>();
-  o.add(buildNodePool());
-  o.add(buildNodePool());
-  return o;
-}
-
-checkUnnamed1871(core.List<api.NodePool> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkNodePool(o[0]);
-  checkNodePool(o[1]);
-}
-
-core.int buildCounterListNodePoolsResponse = 0;
-buildListNodePoolsResponse() {
-  var o = new api.ListNodePoolsResponse();
-  buildCounterListNodePoolsResponse++;
-  if (buildCounterListNodePoolsResponse < 3) {
-    o.nodePools = buildUnnamed1871();
-  }
-  buildCounterListNodePoolsResponse--;
-  return o;
-}
-
-checkListNodePoolsResponse(api.ListNodePoolsResponse o) {
-  buildCounterListNodePoolsResponse++;
-  if (buildCounterListNodePoolsResponse < 3) {
-    checkUnnamed1871(o.nodePools);
-  }
-  buildCounterListNodePoolsResponse--;
-}
-
-buildUnnamed1872() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1872(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1873() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1873(core.List<api.Operation> o) {
+checkUnnamed1871(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -645,8 +650,8 @@
   var o = new api.ListOperationsResponse();
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
-    o.missingZones = buildUnnamed1872();
-    o.operations = buildUnnamed1873();
+    o.missingZones = buildUnnamed1870();
+    o.operations = buildUnnamed1871();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -655,8 +660,8 @@
 checkListOperationsResponse(api.ListOperationsResponse o) {
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
-    checkUnnamed1872(o.missingZones);
-    checkUnnamed1873(o.operations);
+    checkUnnamed1870(o.missingZones);
+    checkUnnamed1871(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
@@ -690,14 +695,14 @@
   buildCounterMasterAuth--;
 }
 
-buildUnnamed1874() {
+buildUnnamed1872() {
   var o = new core.List<api.CidrBlock>();
   o.add(buildCidrBlock());
   o.add(buildCidrBlock());
   return o;
 }
 
-checkUnnamed1874(core.List<api.CidrBlock> o) {
+checkUnnamed1872(core.List<api.CidrBlock> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCidrBlock(o[0]);
   checkCidrBlock(o[1]);
@@ -708,7 +713,7 @@
   var o = new api.MasterAuthorizedNetworksConfig();
   buildCounterMasterAuthorizedNetworksConfig++;
   if (buildCounterMasterAuthorizedNetworksConfig < 3) {
-    o.cidrBlocks = buildUnnamed1874();
+    o.cidrBlocks = buildUnnamed1872();
     o.enabled = true;
   }
   buildCounterMasterAuthorizedNetworksConfig--;
@@ -718,7 +723,7 @@
 checkMasterAuthorizedNetworksConfig(api.MasterAuthorizedNetworksConfig o) {
   buildCounterMasterAuthorizedNetworksConfig++;
   if (buildCounterMasterAuthorizedNetworksConfig < 3) {
-    checkUnnamed1874(o.cidrBlocks);
+    checkUnnamed1872(o.cidrBlocks);
     unittest.expect(o.enabled, unittest.isTrue);
   }
   buildCounterMasterAuthorizedNetworksConfig--;
@@ -745,66 +750,66 @@
   buildCounterNetworkPolicy--;
 }
 
-buildUnnamed1875() {
+buildUnnamed1873() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed1875(core.List<api.AcceleratorConfig> o) {
+checkUnnamed1873(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
+buildUnnamed1874() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed1874(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
+buildUnnamed1875() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed1875(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 buildUnnamed1876() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed1876(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
-buildUnnamed1877() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed1877(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
-buildUnnamed1878() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1878(core.List<core.String> o) {
+checkUnnamed1876(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1879() {
+buildUnnamed1877() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1879(core.List<core.String> o) {
+checkUnnamed1877(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -815,17 +820,17 @@
   var o = new api.NodeConfig();
   buildCounterNodeConfig++;
   if (buildCounterNodeConfig < 3) {
-    o.accelerators = buildUnnamed1875();
+    o.accelerators = buildUnnamed1873();
     o.diskSizeGb = 42;
     o.imageType = "foo";
-    o.labels = buildUnnamed1876();
+    o.labels = buildUnnamed1874();
     o.localSsdCount = 42;
     o.machineType = "foo";
-    o.metadata = buildUnnamed1877();
-    o.oauthScopes = buildUnnamed1878();
+    o.metadata = buildUnnamed1875();
+    o.oauthScopes = buildUnnamed1876();
     o.preemptible = true;
     o.serviceAccount = "foo";
-    o.tags = buildUnnamed1879();
+    o.tags = buildUnnamed1877();
   }
   buildCounterNodeConfig--;
   return o;
@@ -834,17 +839,17 @@
 checkNodeConfig(api.NodeConfig o) {
   buildCounterNodeConfig++;
   if (buildCounterNodeConfig < 3) {
-    checkUnnamed1875(o.accelerators);
+    checkUnnamed1873(o.accelerators);
     unittest.expect(o.diskSizeGb, unittest.equals(42));
     unittest.expect(o.imageType, unittest.equals('foo'));
-    checkUnnamed1876(o.labels);
+    checkUnnamed1874(o.labels);
     unittest.expect(o.localSsdCount, unittest.equals(42));
     unittest.expect(o.machineType, unittest.equals('foo'));
-    checkUnnamed1877(o.metadata);
-    checkUnnamed1878(o.oauthScopes);
+    checkUnnamed1875(o.metadata);
+    checkUnnamed1876(o.oauthScopes);
     unittest.expect(o.preemptible, unittest.isTrue);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkUnnamed1879(o.tags);
+    checkUnnamed1877(o.tags);
   }
   buildCounterNodeConfig--;
 }
@@ -872,14 +877,14 @@
   buildCounterNodeManagement--;
 }
 
-buildUnnamed1880() {
+buildUnnamed1878() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1880(core.List<core.String> o) {
+checkUnnamed1878(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -893,7 +898,7 @@
     o.autoscaling = buildNodePoolAutoscaling();
     o.config = buildNodeConfig();
     o.initialNodeCount = 42;
-    o.instanceGroupUrls = buildUnnamed1880();
+    o.instanceGroupUrls = buildUnnamed1878();
     o.management = buildNodeManagement();
     o.name = "foo";
     o.selfLink = "foo";
@@ -911,7 +916,7 @@
     checkNodePoolAutoscaling(o.autoscaling);
     checkNodeConfig(o.config);
     unittest.expect(o.initialNodeCount, unittest.equals(42));
-    checkUnnamed1880(o.instanceGroupUrls);
+    checkUnnamed1878(o.instanceGroupUrls);
     checkNodeManagement(o.management);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -951,9 +956,11 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     o.detail = "foo";
+    o.endTime = "foo";
     o.name = "foo";
     o.operationType = "foo";
     o.selfLink = "foo";
+    o.startTime = "foo";
     o.status = "foo";
     o.statusMessage = "foo";
     o.targetLink = "foo";
@@ -967,9 +974,11 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.detail, unittest.equals('foo'));
+    unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
+    unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
@@ -982,19 +991,43 @@
 buildRollbackNodePoolUpgradeRequest() {
   var o = new api.RollbackNodePoolUpgradeRequest();
   buildCounterRollbackNodePoolUpgradeRequest++;
-  if (buildCounterRollbackNodePoolUpgradeRequest < 3) {
-  }
+  if (buildCounterRollbackNodePoolUpgradeRequest < 3) {}
   buildCounterRollbackNodePoolUpgradeRequest--;
   return o;
 }
 
 checkRollbackNodePoolUpgradeRequest(api.RollbackNodePoolUpgradeRequest o) {
   buildCounterRollbackNodePoolUpgradeRequest++;
-  if (buildCounterRollbackNodePoolUpgradeRequest < 3) {
-  }
+  if (buildCounterRollbackNodePoolUpgradeRequest < 3) {}
   buildCounterRollbackNodePoolUpgradeRequest--;
 }
 
+buildUnnamed1879() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1879(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1880() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1880(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed1881() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1008,32 +1041,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1882() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1882(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1883() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1883(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterServerConfig = 0;
 buildServerConfig() {
   var o = new api.ServerConfig();
@@ -1041,9 +1048,9 @@
   if (buildCounterServerConfig < 3) {
     o.defaultClusterVersion = "foo";
     o.defaultImageType = "foo";
-    o.validImageTypes = buildUnnamed1881();
-    o.validMasterVersions = buildUnnamed1882();
-    o.validNodeVersions = buildUnnamed1883();
+    o.validImageTypes = buildUnnamed1879();
+    o.validMasterVersions = buildUnnamed1880();
+    o.validNodeVersions = buildUnnamed1881();
   }
   buildCounterServerConfig--;
   return o;
@@ -1054,9 +1061,9 @@
   if (buildCounterServerConfig < 3) {
     unittest.expect(o.defaultClusterVersion, unittest.equals('foo'));
     unittest.expect(o.defaultImageType, unittest.equals('foo'));
-    checkUnnamed1881(o.validImageTypes);
-    checkUnnamed1882(o.validMasterVersions);
-    checkUnnamed1883(o.validNodeVersions);
+    checkUnnamed1879(o.validImageTypes);
+    checkUnnamed1880(o.validMasterVersions);
+    checkUnnamed1881(o.validNodeVersions);
   }
   buildCounterServerConfig--;
 }
@@ -1080,14 +1087,14 @@
   buildCounterSetAddonsConfigRequest--;
 }
 
-buildUnnamed1884() {
+buildUnnamed1882() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1884(core.Map<core.String, core.String> o) {
+checkUnnamed1882(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1099,7 +1106,7 @@
   buildCounterSetLabelsRequest++;
   if (buildCounterSetLabelsRequest < 3) {
     o.labelFingerprint = "foo";
-    o.resourceLabels = buildUnnamed1884();
+    o.resourceLabels = buildUnnamed1882();
   }
   buildCounterSetLabelsRequest--;
   return o;
@@ -1109,7 +1116,7 @@
   buildCounterSetLabelsRequest++;
   if (buildCounterSetLabelsRequest < 3) {
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkUnnamed1884(o.resourceLabels);
+    checkUnnamed1882(o.resourceLabels);
   }
   buildCounterSetLabelsRequest--;
 }
@@ -1133,14 +1140,14 @@
   buildCounterSetLegacyAbacRequest--;
 }
 
-buildUnnamed1885() {
+buildUnnamed1883() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1885(core.List<core.String> o) {
+checkUnnamed1883(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1151,7 +1158,7 @@
   var o = new api.SetLocationsRequest();
   buildCounterSetLocationsRequest++;
   if (buildCounterSetLocationsRequest < 3) {
-    o.locations = buildUnnamed1885();
+    o.locations = buildUnnamed1883();
   }
   buildCounterSetLocationsRequest--;
   return o;
@@ -1160,7 +1167,7 @@
 checkSetLocationsRequest(api.SetLocationsRequest o) {
   buildCounterSetLocationsRequest++;
   if (buildCounterSetLocationsRequest < 3) {
-    checkUnnamed1885(o.locations);
+    checkUnnamed1883(o.locations);
   }
   buildCounterSetLocationsRequest--;
 }
@@ -1304,16 +1311,14 @@
 buildStartIPRotationRequest() {
   var o = new api.StartIPRotationRequest();
   buildCounterStartIPRotationRequest++;
-  if (buildCounterStartIPRotationRequest < 3) {
-  }
+  if (buildCounterStartIPRotationRequest < 3) {}
   buildCounterStartIPRotationRequest--;
   return o;
 }
 
 checkStartIPRotationRequest(api.StartIPRotationRequest o) {
   buildCounterStartIPRotationRequest++;
-  if (buildCounterStartIPRotationRequest < 3) {
-  }
+  if (buildCounterStartIPRotationRequest < 3) {}
   buildCounterStartIPRotationRequest--;
 }
 
@@ -1376,7 +1381,6 @@
   buildCounterUpdateNodePoolRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AcceleratorConfig", () {
     unittest.test("to-json--from-json", () {
@@ -1386,7 +1390,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AddonsConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAddonsConfig();
@@ -1395,7 +1398,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoUpgradeOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoUpgradeOptions();
@@ -1404,7 +1406,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CancelOperationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCancelOperationRequest();
@@ -1413,7 +1414,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CidrBlock", () {
     unittest.test("to-json--from-json", () {
       var o = buildCidrBlock();
@@ -1422,7 +1422,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClientCertificateConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildClientCertificateConfig();
@@ -1431,7 +1430,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Cluster", () {
     unittest.test("to-json--from-json", () {
       var o = buildCluster();
@@ -1440,7 +1438,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClusterUpdate", () {
     unittest.test("to-json--from-json", () {
       var o = buildClusterUpdate();
@@ -1449,7 +1446,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CompleteIPRotationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCompleteIPRotationRequest();
@@ -1458,7 +1454,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateClusterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateClusterRequest();
@@ -1467,7 +1462,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateNodePoolRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateNodePoolRequest();
@@ -1476,7 +1470,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -1485,7 +1478,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HorizontalPodAutoscaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildHorizontalPodAutoscaling();
@@ -1494,7 +1486,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpLoadBalancing", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpLoadBalancing();
@@ -1503,7 +1494,6 @@
     });
   });
 
-
   unittest.group("obj-schema-IPAllocationPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildIPAllocationPolicy();
@@ -1512,7 +1502,6 @@
     });
   });
 
-
   unittest.group("obj-schema-KubernetesDashboard", () {
     unittest.test("to-json--from-json", () {
       var o = buildKubernetesDashboard();
@@ -1521,7 +1510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LegacyAbac", () {
     unittest.test("to-json--from-json", () {
       var o = buildLegacyAbac();
@@ -1530,7 +1518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListClustersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListClustersResponse();
@@ -1539,7 +1526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListNodePoolsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListNodePoolsResponse();
@@ -1548,7 +1534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -1557,7 +1542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MasterAuth", () {
     unittest.test("to-json--from-json", () {
       var o = buildMasterAuth();
@@ -1566,7 +1550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MasterAuthorizedNetworksConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildMasterAuthorizedNetworksConfig();
@@ -1575,7 +1558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkPolicy", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkPolicy();
@@ -1584,7 +1566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NodeConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildNodeConfig();
@@ -1593,7 +1574,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NodeManagement", () {
     unittest.test("to-json--from-json", () {
       var o = buildNodeManagement();
@@ -1602,7 +1582,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NodePool", () {
     unittest.test("to-json--from-json", () {
       var o = buildNodePool();
@@ -1611,7 +1590,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NodePoolAutoscaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildNodePoolAutoscaling();
@@ -1620,7 +1598,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1629,7 +1606,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RollbackNodePoolUpgradeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRollbackNodePoolUpgradeRequest();
@@ -1638,7 +1614,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ServerConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildServerConfig();
@@ -1647,7 +1622,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetAddonsConfigRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetAddonsConfigRequest();
@@ -1656,7 +1630,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetLabelsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetLabelsRequest();
@@ -1665,7 +1638,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetLegacyAbacRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetLegacyAbacRequest();
@@ -1674,7 +1646,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetLocationsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetLocationsRequest();
@@ -1683,7 +1654,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetLoggingServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetLoggingServiceRequest();
@@ -1692,7 +1662,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetMasterAuthRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetMasterAuthRequest();
@@ -1701,7 +1670,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetMonitoringServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetMonitoringServiceRequest();
@@ -1710,7 +1678,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetNetworkPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetNetworkPolicyRequest();
@@ -1719,7 +1686,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetNodePoolAutoscalingRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetNodePoolAutoscalingRequest();
@@ -1728,7 +1694,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetNodePoolManagementRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetNodePoolManagementRequest();
@@ -1737,7 +1702,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetNodePoolSizeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetNodePoolSizeRequest();
@@ -1746,7 +1710,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StartIPRotationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildStartIPRotationRequest();
@@ -1755,7 +1718,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateClusterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateClusterRequest();
@@ -1764,7 +1726,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateMasterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateMasterRequest();
@@ -1773,7 +1734,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateNodePoolRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateNodePoolRequest();
@@ -1782,12 +1742,11 @@
     });
   });
 
-
   unittest.group("resource-ProjectsZonesResourceApi", () {
     unittest.test("method--getServerconfig", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesResourceApi res = new api.ContainerApi(mock).projects.zones;
+      api.ProjectsZonesResourceApi res =
+          new api.ContainerApi(mock).projects.zones;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1795,23 +1754,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/serverconfig", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/serverconfig"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/serverconfig"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1824,33 +1789,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildServerConfig());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getServerconfig(arg_projectId, arg_zone).then(unittest.expectAsync1(((api.ServerConfig response) {
+      res
+          .getServerconfig(arg_projectId, arg_zone)
+          .then(unittest.expectAsync1(((api.ServerConfig response) {
         checkServerConfig(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsZonesClustersResourceApi", () {
     unittest.test("method--addons", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetAddonsConfigRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -1863,30 +1829,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/addons", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/addons"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/addons"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1899,29 +1873,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addons(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .addons(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--completeIpRotation", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildCompleteIPRotationRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -1934,30 +1911,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf(":completeIpRotation", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals(":completeIpRotation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals(":completeIpRotation"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -1970,29 +1955,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.completeIpRotation(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .completeIpRotation(
+              arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildCreateClusterRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2004,23 +1993,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/clusters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/clusters"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2033,29 +2028,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_projectId, arg_zone).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_projectId, arg_zone)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       var arg_clusterId = "foo";
@@ -2064,23 +2062,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2096,29 +2100,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       var arg_clusterId = "foo";
@@ -2127,23 +2134,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2159,29 +2172,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCluster());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Cluster response) {
+      res
+          .get(arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Cluster response) {
         checkCluster(response);
       })));
     });
 
     unittest.test("method--legacyAbac", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetLegacyAbacRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2194,30 +2210,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/legacyAbac", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/legacyAbac"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/legacyAbac"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -2230,29 +2254,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.legacyAbac(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .legacyAbac(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2260,23 +2287,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/clusters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/clusters"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2289,29 +2322,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListClustersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, arg_zone).then(unittest.expectAsync1(((api.ListClustersResponse response) {
+      res
+          .list(arg_projectId, arg_zone)
+          .then(unittest.expectAsync1(((api.ListClustersResponse response) {
         checkListClustersResponse(response);
       })));
     });
 
     unittest.test("method--locations", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetLocationsRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2324,30 +2360,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/locations", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/locations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/locations"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2360,29 +2404,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.locations(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .locations(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--logging", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetLoggingServiceRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2395,30 +2442,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/logging", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/logging"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/logging"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -2431,29 +2486,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.logging(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .logging(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--master", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildUpdateMasterRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2466,30 +2524,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/master", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/master"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/master"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2502,29 +2568,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.master(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .master(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--monitoring", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetMonitoringServiceRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2537,30 +2606,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/monitoring", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/monitoring"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/monitoring"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -2573,29 +2650,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.monitoring(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .monitoring(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--resourceLabels", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetLabelsRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2608,30 +2688,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/resourceLabels", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceLabels"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/resourceLabels"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -2644,29 +2732,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resourceLabels(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .resourceLabels(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setMasterAuth", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetMasterAuthRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2679,30 +2770,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf(":setMasterAuth", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals(":setMasterAuth"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals(":setMasterAuth"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -2715,29 +2814,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setMasterAuth(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setMasterAuth(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setNetworkPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildSetNetworkPolicyRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2750,30 +2852,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf(":setNetworkPolicy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals(":setNetworkPolicy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals(":setNetworkPolicy"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -2786,29 +2896,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setNetworkPolicy(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setNetworkPolicy(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--startIpRotation", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildStartIPRotationRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2821,30 +2934,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf(":startIpRotation", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals(":startIpRotation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals(":startIpRotation"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -2857,29 +2978,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.startIpRotation(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .startIpRotation(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      api.ProjectsZonesClustersResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters;
       var arg_request = buildUpdateClusterRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2892,23 +3016,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2924,33 +3054,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsZonesClustersNodePoolsResourceApi", () {
     unittest.test("method--autoscaling", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_request = buildSetNodePoolAutoscalingRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -2964,37 +3095,47 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         index = path.indexOf("/autoscaling", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_nodePoolId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/autoscaling"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/autoscaling"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -3007,29 +3148,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.autoscaling(arg_request, arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .autoscaling(arg_request, arg_projectId, arg_zone, arg_clusterId,
+              arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_request = buildCreateNodePoolRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -3042,30 +3187,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/nodePools"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/nodePools"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -3078,29 +3231,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       var arg_clusterId = "foo";
@@ -3110,30 +3266,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3149,29 +3313,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       var arg_clusterId = "foo";
@@ -3181,30 +3348,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3220,29 +3395,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildNodePool());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.NodePool response) {
+      res
+          .get(arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.NodePool response) {
         checkNodePool(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       var arg_clusterId = "foo";
@@ -3251,30 +3429,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/nodePools"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/nodePools"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -3287,29 +3473,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListNodePoolsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, arg_zone, arg_clusterId).then(unittest.expectAsync1(((api.ListNodePoolsResponse response) {
+      res
+          .list(arg_projectId, arg_zone, arg_clusterId)
+          .then(unittest.expectAsync1(((api.ListNodePoolsResponse response) {
         checkListNodePoolsResponse(response);
       })));
     });
 
     unittest.test("method--rollback", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_request = buildRollbackNodePoolUpgradeRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -3323,37 +3512,47 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         index = path.indexOf(":rollback", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_nodePoolId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":rollback"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":rollback"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3366,29 +3565,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.rollback(arg_request, arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .rollback(arg_request, arg_projectId, arg_zone, arg_clusterId,
+              arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setManagement", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_request = buildSetNodePoolManagementRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -3402,37 +3605,47 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         index = path.indexOf("/setManagement", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_nodePoolId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/setManagement"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/setManagement"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -3445,29 +3658,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setManagement(arg_request, arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setManagement(arg_request, arg_projectId, arg_zone, arg_clusterId,
+              arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setSize", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_request = buildSetNodePoolSizeRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -3481,37 +3698,47 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         index = path.indexOf("/setSize", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_nodePoolId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/setSize"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/setSize"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -3524,29 +3751,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setSize(arg_request, arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .setSize(arg_request, arg_projectId, arg_zone, arg_clusterId,
+              arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesClustersNodePoolsResourceApi res = new api.ContainerApi(mock).projects.zones.clusters.nodePools;
+      api.ProjectsZonesClustersNodePoolsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.clusters.nodePools;
       var arg_request = buildUpdateNodePoolRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -3560,37 +3791,47 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf("/nodePools/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/nodePools/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/nodePools/"));
         pathOffset += 11;
         index = path.indexOf("/update", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_nodePoolId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/update"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/update"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -3603,33 +3844,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_projectId, arg_zone, arg_clusterId,
+              arg_nodePoolId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsZonesOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesOperationsResourceApi res = new api.ContainerApi(mock).projects.zones.operations;
+      api.ProjectsZonesOperationsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.operations;
       var arg_request = buildCancelOperationRequest();
       var arg_projectId = "foo";
       var arg_zone = "foo";
@@ -3642,30 +3885,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/operations/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/operations/"));
         pathOffset += 12;
         index = path.indexOf(":cancel", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_operationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":cancel"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":cancel"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -3678,29 +3929,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_projectId, arg_zone, arg_operationId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .cancel(arg_request, arg_projectId, arg_zone, arg_operationId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesOperationsResourceApi res = new api.ContainerApi(mock).projects.zones.operations;
+      api.ProjectsZonesOperationsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.operations;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       var arg_operationId = "foo";
@@ -3709,23 +3963,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/operations/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/operations/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3741,29 +4001,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_zone, arg_operationId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .get(arg_projectId, arg_zone, arg_operationId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsZonesOperationsResourceApi res = new api.ContainerApi(mock).projects.zones.operations;
+      api.ProjectsZonesOperationsResourceApi res =
+          new api.ContainerApi(mock).projects.zones.operations;
       var arg_projectId = "foo";
       var arg_zone = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3771,23 +4034,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/zones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/zones/"));
         pathOffset += 7;
         index = path.indexOf("/operations", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/operations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/operations"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -3800,27 +4069,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, arg_zone).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_projectId, arg_zone)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 82e0765..abad854 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.customsearch.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/customsearch/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -74,30 +73,30 @@
   buildCounterContextFacets--;
 }
 
-buildUnnamed299() {
+buildUnnamed298() {
   var o = new core.List<api.ContextFacets>();
   o.add(buildContextFacets());
   o.add(buildContextFacets());
   return o;
 }
 
-checkUnnamed299(core.List<api.ContextFacets> o) {
+checkUnnamed298(core.List<api.ContextFacets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextFacets(o[0]);
   checkContextFacets(o[1]);
 }
 
-buildUnnamed300() {
+buildUnnamed299() {
   var o = new core.List<core.List<api.ContextFacets>>();
-  o.add(buildUnnamed299());
-  o.add(buildUnnamed299());
+  o.add(buildUnnamed298());
+  o.add(buildUnnamed298());
   return o;
 }
 
-checkUnnamed300(core.List<core.List<api.ContextFacets>> o) {
+checkUnnamed299(core.List<core.List<api.ContextFacets>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed299(o[0]);
-  checkUnnamed299(o[1]);
+  checkUnnamed298(o[0]);
+  checkUnnamed298(o[1]);
 }
 
 core.int buildCounterContext = 0;
@@ -105,7 +104,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.facets = buildUnnamed300();
+    o.facets = buildUnnamed299();
     o.title = "foo";
   }
   buildCounterContext--;
@@ -115,7 +114,7 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed300(o.facets);
+    checkUnnamed299(o.facets);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterContext--;
@@ -146,14 +145,14 @@
   buildCounterPromotionBodyLines--;
 }
 
-buildUnnamed301() {
+buildUnnamed300() {
   var o = new core.List<api.PromotionBodyLines>();
   o.add(buildPromotionBodyLines());
   o.add(buildPromotionBodyLines());
   return o;
 }
 
-checkUnnamed301(core.List<api.PromotionBodyLines> o) {
+checkUnnamed300(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotionBodyLines(o[0]);
   checkPromotionBodyLines(o[1]);
@@ -187,7 +186,7 @@
   var o = new api.Promotion();
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    o.bodyLines = buildUnnamed301();
+    o.bodyLines = buildUnnamed300();
     o.displayLink = "foo";
     o.htmlTitle = "foo";
     o.image = buildPromotionImage();
@@ -201,7 +200,7 @@
 checkPromotion(api.Promotion o) {
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    checkUnnamed301(o.bodyLines);
+    checkUnnamed300(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkPromotionImage(o.image);
@@ -354,56 +353,74 @@
   buildCounterResultLabels--;
 }
 
-buildUnnamed302() {
+buildUnnamed301() {
   var o = new core.List<api.ResultLabels>();
   o.add(buildResultLabels());
   o.add(buildResultLabels());
   return o;
 }
 
-checkUnnamed302(core.List<api.ResultLabels> o) {
+checkUnnamed301(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultLabels(o[0]);
   checkResultLabels(o[1]);
 }
 
-buildUnnamed303() {
+buildUnnamed302() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed303(core.Map<core.String, core.Object> o) {
+checkUnnamed302(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
+}
+
+buildUnnamed303() {
+  var o = new core.List<core.Map<core.String, core.Object>>();
+  o.add(buildUnnamed302());
+  o.add(buildUnnamed302());
+  return o;
+}
+
+checkUnnamed303(core.List<core.Map<core.String, core.Object>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed302(o[0]);
+  checkUnnamed302(o[1]);
 }
 
 buildUnnamed304() {
-  var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed303());
-  o.add(buildUnnamed303());
+  var o = new core
+      .Map<core.String, core.List<core.Map<core.String, core.Object>>>();
+  o["x"] = buildUnnamed303();
+  o["y"] = buildUnnamed303();
   return o;
 }
 
-checkUnnamed304(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed304(
+    core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed303(o[0]);
-  checkUnnamed303(o[1]);
-}
-
-buildUnnamed305() {
-  var o = new core.Map<core.String, core.List<core.Map<core.String, core.Object>>>();
-  o["x"] = buildUnnamed304();
-  o["y"] = buildUnnamed304();
-  return o;
-}
-
-checkUnnamed305(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed304(o["x"]);
-  checkUnnamed304(o["y"]);
+  checkUnnamed303(o["x"]);
+  checkUnnamed303(o["y"]);
 }
 
 core.int buildCounterResult = 0;
@@ -420,10 +437,10 @@
     o.htmlTitle = "foo";
     o.image = buildResultImage();
     o.kind = "foo";
-    o.labels = buildUnnamed302();
+    o.labels = buildUnnamed301();
     o.link = "foo";
     o.mime = "foo";
-    o.pagemap = buildUnnamed305();
+    o.pagemap = buildUnnamed304();
     o.snippet = "foo";
     o.title = "foo";
   }
@@ -443,66 +460,66 @@
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkResultImage(o.image);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed302(o.labels);
+    checkUnnamed301(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.mime, unittest.equals('foo'));
-    checkUnnamed305(o.pagemap);
+    checkUnnamed304(o.pagemap);
     unittest.expect(o.snippet, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterResult--;
 }
 
-buildUnnamed306() {
+buildUnnamed305() {
   var o = new core.List<api.Result>();
   o.add(buildResult());
   o.add(buildResult());
   return o;
 }
 
-checkUnnamed306(core.List<api.Result> o) {
+checkUnnamed305(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResult(o[0]);
   checkResult(o[1]);
 }
 
-buildUnnamed307() {
+buildUnnamed306() {
   var o = new core.List<api.Promotion>();
   o.add(buildPromotion());
   o.add(buildPromotion());
   return o;
 }
 
-checkUnnamed307(core.List<api.Promotion> o) {
+checkUnnamed306(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotion(o[0]);
   checkPromotion(o[1]);
 }
 
-buildUnnamed308() {
+buildUnnamed307() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed308(core.List<api.Query> o) {
+checkUnnamed307(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
 }
 
-buildUnnamed309() {
+buildUnnamed308() {
   var o = new core.Map<core.String, core.List<api.Query>>();
-  o["x"] = buildUnnamed308();
-  o["y"] = buildUnnamed308();
+  o["x"] = buildUnnamed307();
+  o["y"] = buildUnnamed307();
   return o;
 }
 
-checkUnnamed309(core.Map<core.String, core.List<api.Query>> o) {
+checkUnnamed308(core.Map<core.String, core.List<api.Query>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed308(o["x"]);
-  checkUnnamed308(o["y"]);
+  checkUnnamed307(o["x"]);
+  checkUnnamed307(o["y"]);
 }
 
 core.int buildCounterSearchSearchInformation = 0;
@@ -578,10 +595,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     o.context = buildContext();
-    o.items = buildUnnamed306();
+    o.items = buildUnnamed305();
     o.kind = "foo";
-    o.promotions = buildUnnamed307();
-    o.queries = buildUnnamed309();
+    o.promotions = buildUnnamed306();
+    o.queries = buildUnnamed308();
     o.searchInformation = buildSearchSearchInformation();
     o.spelling = buildSearchSpelling();
     o.url = buildSearchUrl();
@@ -594,10 +611,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     checkContext(o.context);
-    checkUnnamed306(o.items);
+    checkUnnamed305(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed307(o.promotions);
-    checkUnnamed309(o.queries);
+    checkUnnamed306(o.promotions);
+    checkUnnamed308(o.queries);
     checkSearchSearchInformation(o.searchInformation);
     checkSearchSpelling(o.spelling);
     checkSearchUrl(o.url);
@@ -605,7 +622,6 @@
   buildCounterSearch--;
 }
 
-
 main() {
   unittest.group("obj-schema-ContextFacets", () {
     unittest.test("to-json--from-json", () {
@@ -615,7 +631,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Context", () {
     unittest.test("to-json--from-json", () {
       var o = buildContext();
@@ -624,7 +639,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PromotionBodyLines", () {
     unittest.test("to-json--from-json", () {
       var o = buildPromotionBodyLines();
@@ -633,7 +647,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PromotionImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildPromotionImage();
@@ -642,7 +655,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Promotion", () {
     unittest.test("to-json--from-json", () {
       var o = buildPromotion();
@@ -651,7 +663,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Query", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuery();
@@ -660,7 +671,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultImage();
@@ -669,7 +679,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultLabels", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultLabels();
@@ -678,7 +687,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Result", () {
     unittest.test("to-json--from-json", () {
       var o = buildResult();
@@ -687,7 +695,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchSearchInformation", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchSearchInformation();
@@ -696,7 +703,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchSpelling", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchSpelling();
@@ -705,7 +711,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchUrl", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchUrl();
@@ -714,7 +719,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Search", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearch();
@@ -723,10 +727,8 @@
     });
   });
 
-
   unittest.group("resource-CseResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.CseResourceApi res = new api.CustomsearchApi(mock).cse;
       var arg_q = "foo";
@@ -765,11 +767,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("customsearch/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("customsearch/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("v1"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 2), unittest.equals("v1"));
         pathOffset += 2;
 
         var query = (req.url).query;
@@ -782,58 +787,106 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["q"].first, unittest.equals(arg_q));
         unittest.expect(queryMap["c2coff"].first, unittest.equals(arg_c2coff));
         unittest.expect(queryMap["cr"].first, unittest.equals(arg_cr));
         unittest.expect(queryMap["cx"].first, unittest.equals(arg_cx));
-        unittest.expect(queryMap["dateRestrict"].first, unittest.equals(arg_dateRestrict));
-        unittest.expect(queryMap["exactTerms"].first, unittest.equals(arg_exactTerms));
-        unittest.expect(queryMap["excludeTerms"].first, unittest.equals(arg_excludeTerms));
-        unittest.expect(queryMap["fileType"].first, unittest.equals(arg_fileType));
+        unittest.expect(
+            queryMap["dateRestrict"].first, unittest.equals(arg_dateRestrict));
+        unittest.expect(
+            queryMap["exactTerms"].first, unittest.equals(arg_exactTerms));
+        unittest.expect(
+            queryMap["excludeTerms"].first, unittest.equals(arg_excludeTerms));
+        unittest.expect(
+            queryMap["fileType"].first, unittest.equals(arg_fileType));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
         unittest.expect(queryMap["gl"].first, unittest.equals(arg_gl));
-        unittest.expect(queryMap["googlehost"].first, unittest.equals(arg_googlehost));
-        unittest.expect(queryMap["highRange"].first, unittest.equals(arg_highRange));
+        unittest.expect(
+            queryMap["googlehost"].first, unittest.equals(arg_googlehost));
+        unittest.expect(
+            queryMap["highRange"].first, unittest.equals(arg_highRange));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["hq"].first, unittest.equals(arg_hq));
-        unittest.expect(queryMap["imgColorType"].first, unittest.equals(arg_imgColorType));
-        unittest.expect(queryMap["imgDominantColor"].first, unittest.equals(arg_imgDominantColor));
-        unittest.expect(queryMap["imgSize"].first, unittest.equals(arg_imgSize));
-        unittest.expect(queryMap["imgType"].first, unittest.equals(arg_imgType));
-        unittest.expect(queryMap["linkSite"].first, unittest.equals(arg_linkSite));
-        unittest.expect(queryMap["lowRange"].first, unittest.equals(arg_lowRange));
+        unittest.expect(
+            queryMap["imgColorType"].first, unittest.equals(arg_imgColorType));
+        unittest.expect(queryMap["imgDominantColor"].first,
+            unittest.equals(arg_imgDominantColor));
+        unittest.expect(
+            queryMap["imgSize"].first, unittest.equals(arg_imgSize));
+        unittest.expect(
+            queryMap["imgType"].first, unittest.equals(arg_imgType));
+        unittest.expect(
+            queryMap["linkSite"].first, unittest.equals(arg_linkSite));
+        unittest.expect(
+            queryMap["lowRange"].first, unittest.equals(arg_lowRange));
         unittest.expect(queryMap["lr"].first, unittest.equals(arg_lr));
-        unittest.expect(core.int.parse(queryMap["num"].first), unittest.equals(arg_num));
-        unittest.expect(queryMap["orTerms"].first, unittest.equals(arg_orTerms));
-        unittest.expect(queryMap["relatedSite"].first, unittest.equals(arg_relatedSite));
+        unittest.expect(
+            core.int.parse(queryMap["num"].first), unittest.equals(arg_num));
+        unittest.expect(
+            queryMap["orTerms"].first, unittest.equals(arg_orTerms));
+        unittest.expect(
+            queryMap["relatedSite"].first, unittest.equals(arg_relatedSite));
         unittest.expect(queryMap["rights"].first, unittest.equals(arg_rights));
         unittest.expect(queryMap["safe"].first, unittest.equals(arg_safe));
-        unittest.expect(queryMap["searchType"].first, unittest.equals(arg_searchType));
-        unittest.expect(queryMap["siteSearch"].first, unittest.equals(arg_siteSearch));
-        unittest.expect(queryMap["siteSearchFilter"].first, unittest.equals(arg_siteSearchFilter));
+        unittest.expect(
+            queryMap["searchType"].first, unittest.equals(arg_searchType));
+        unittest.expect(
+            queryMap["siteSearch"].first, unittest.equals(arg_siteSearch));
+        unittest.expect(queryMap["siteSearchFilter"].first,
+            unittest.equals(arg_siteSearchFilter));
         unittest.expect(queryMap["sort"].first, unittest.equals(arg_sort));
-        unittest.expect(core.int.parse(queryMap["start"].first), unittest.equals(arg_start));
-
+        unittest.expect(core.int.parse(queryMap["start"].first),
+            unittest.equals(arg_start));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_q, c2coff: arg_c2coff, cr: arg_cr, cx: arg_cx, dateRestrict: arg_dateRestrict, exactTerms: arg_exactTerms, excludeTerms: arg_excludeTerms, fileType: arg_fileType, filter: arg_filter, gl: arg_gl, googlehost: arg_googlehost, highRange: arg_highRange, hl: arg_hl, hq: arg_hq, imgColorType: arg_imgColorType, imgDominantColor: arg_imgDominantColor, imgSize: arg_imgSize, imgType: arg_imgType, linkSite: arg_linkSite, lowRange: arg_lowRange, lr: arg_lr, num: arg_num, orTerms: arg_orTerms, relatedSite: arg_relatedSite, rights: arg_rights, safe: arg_safe, searchType: arg_searchType, siteSearch: arg_siteSearch, siteSearchFilter: arg_siteSearchFilter, sort: arg_sort, start: arg_start).then(unittest.expectAsync1(((api.Search response) {
+      res
+          .list(arg_q,
+              c2coff: arg_c2coff,
+              cr: arg_cr,
+              cx: arg_cx,
+              dateRestrict: arg_dateRestrict,
+              exactTerms: arg_exactTerms,
+              excludeTerms: arg_excludeTerms,
+              fileType: arg_fileType,
+              filter: arg_filter,
+              gl: arg_gl,
+              googlehost: arg_googlehost,
+              highRange: arg_highRange,
+              hl: arg_hl,
+              hq: arg_hq,
+              imgColorType: arg_imgColorType,
+              imgDominantColor: arg_imgDominantColor,
+              imgSize: arg_imgSize,
+              imgType: arg_imgType,
+              linkSite: arg_linkSite,
+              lowRange: arg_lowRange,
+              lr: arg_lr,
+              num: arg_num,
+              orTerms: arg_orTerms,
+              relatedSite: arg_relatedSite,
+              rights: arg_rights,
+              safe: arg_safe,
+              searchType: arg_searchType,
+              siteSearch: arg_siteSearch,
+              siteSearchFilter: arg_siteSearchFilter,
+              sort: arg_sort,
+              start: arg_start)
+          .then(unittest.expectAsync1(((api.Search response) {
         checkSearch(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/dataproc/v1_test.dart b/generated/googleapis/test/dataproc/v1_test.dart
index 2d78fe5..f6f48c7 100644
--- a/generated/googleapis/test/dataproc/v1_test.dart
+++ b/generated/googleapis/test/dataproc/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.dataproc.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/dataproc/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -76,40 +75,38 @@
 buildCancelJobRequest() {
   var o = new api.CancelJobRequest();
   buildCounterCancelJobRequest++;
-  if (buildCounterCancelJobRequest < 3) {
-  }
+  if (buildCounterCancelJobRequest < 3) {}
   buildCounterCancelJobRequest--;
   return o;
 }
 
 checkCancelJobRequest(api.CancelJobRequest o) {
   buildCounterCancelJobRequest++;
-  if (buildCounterCancelJobRequest < 3) {
-  }
+  if (buildCounterCancelJobRequest < 3) {}
   buildCounterCancelJobRequest--;
 }
 
-buildUnnamed512() {
+buildUnnamed511() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed512(core.Map<core.String, core.String> o) {
+checkUnnamed511(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed513() {
+buildUnnamed512() {
   var o = new core.List<api.ClusterStatus>();
   o.add(buildClusterStatus());
   o.add(buildClusterStatus());
   return o;
 }
 
-checkUnnamed513(core.List<api.ClusterStatus> o) {
+checkUnnamed512(core.List<api.ClusterStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClusterStatus(o[0]);
   checkClusterStatus(o[1]);
@@ -123,11 +120,11 @@
     o.clusterName = "foo";
     o.clusterUuid = "foo";
     o.config = buildClusterConfig();
-    o.labels = buildUnnamed512();
+    o.labels = buildUnnamed511();
     o.metrics = buildClusterMetrics();
     o.projectId = "foo";
     o.status = buildClusterStatus();
-    o.statusHistory = buildUnnamed513();
+    o.statusHistory = buildUnnamed512();
   }
   buildCounterCluster--;
   return o;
@@ -139,23 +136,23 @@
     unittest.expect(o.clusterName, unittest.equals('foo'));
     unittest.expect(o.clusterUuid, unittest.equals('foo'));
     checkClusterConfig(o.config);
-    checkUnnamed512(o.labels);
+    checkUnnamed511(o.labels);
     checkClusterMetrics(o.metrics);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkClusterStatus(o.status);
-    checkUnnamed513(o.statusHistory);
+    checkUnnamed512(o.statusHistory);
   }
   buildCounterCluster--;
 }
 
-buildUnnamed514() {
+buildUnnamed513() {
   var o = new core.List<api.NodeInitializationAction>();
   o.add(buildNodeInitializationAction());
   o.add(buildNodeInitializationAction());
   return o;
 }
 
-checkUnnamed514(core.List<api.NodeInitializationAction> o) {
+checkUnnamed513(core.List<api.NodeInitializationAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNodeInitializationAction(o[0]);
   checkNodeInitializationAction(o[1]);
@@ -168,7 +165,7 @@
   if (buildCounterClusterConfig < 3) {
     o.configBucket = "foo";
     o.gceClusterConfig = buildGceClusterConfig();
-    o.initializationActions = buildUnnamed514();
+    o.initializationActions = buildUnnamed513();
     o.masterConfig = buildInstanceGroupConfig();
     o.secondaryWorkerConfig = buildInstanceGroupConfig();
     o.softwareConfig = buildSoftwareConfig();
@@ -183,7 +180,7 @@
   if (buildCounterClusterConfig < 3) {
     unittest.expect(o.configBucket, unittest.equals('foo'));
     checkGceClusterConfig(o.gceClusterConfig);
-    checkUnnamed514(o.initializationActions);
+    checkUnnamed513(o.initializationActions);
     checkInstanceGroupConfig(o.masterConfig);
     checkInstanceGroupConfig(o.secondaryWorkerConfig);
     checkSoftwareConfig(o.softwareConfig);
@@ -192,6 +189,19 @@
   buildCounterClusterConfig--;
 }
 
+buildUnnamed514() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed514(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 buildUnnamed515() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -205,6 +215,27 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
+core.int buildCounterClusterMetrics = 0;
+buildClusterMetrics() {
+  var o = new api.ClusterMetrics();
+  buildCounterClusterMetrics++;
+  if (buildCounterClusterMetrics < 3) {
+    o.hdfsMetrics = buildUnnamed514();
+    o.yarnMetrics = buildUnnamed515();
+  }
+  buildCounterClusterMetrics--;
+  return o;
+}
+
+checkClusterMetrics(api.ClusterMetrics o) {
+  buildCounterClusterMetrics++;
+  if (buildCounterClusterMetrics < 3) {
+    checkUnnamed514(o.hdfsMetrics);
+    checkUnnamed515(o.yarnMetrics);
+  }
+  buildCounterClusterMetrics--;
+}
+
 buildUnnamed516() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -218,61 +249,27 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-core.int buildCounterClusterMetrics = 0;
-buildClusterMetrics() {
-  var o = new api.ClusterMetrics();
-  buildCounterClusterMetrics++;
-  if (buildCounterClusterMetrics < 3) {
-    o.hdfsMetrics = buildUnnamed515();
-    o.yarnMetrics = buildUnnamed516();
-  }
-  buildCounterClusterMetrics--;
-  return o;
-}
-
-checkClusterMetrics(api.ClusterMetrics o) {
-  buildCounterClusterMetrics++;
-  if (buildCounterClusterMetrics < 3) {
-    checkUnnamed515(o.hdfsMetrics);
-    checkUnnamed516(o.yarnMetrics);
-  }
-  buildCounterClusterMetrics--;
-}
-
 buildUnnamed517() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed517(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
-buildUnnamed518() {
   var o = new core.List<api.ClusterOperationStatus>();
   o.add(buildClusterOperationStatus());
   o.add(buildClusterOperationStatus());
   return o;
 }
 
-checkUnnamed518(core.List<api.ClusterOperationStatus> o) {
+checkUnnamed517(core.List<api.ClusterOperationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClusterOperationStatus(o[0]);
   checkClusterOperationStatus(o[1]);
 }
 
-buildUnnamed519() {
+buildUnnamed518() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed519(core.List<core.String> o) {
+checkUnnamed518(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -286,11 +283,11 @@
     o.clusterName = "foo";
     o.clusterUuid = "foo";
     o.description = "foo";
-    o.labels = buildUnnamed517();
+    o.labels = buildUnnamed516();
     o.operationType = "foo";
     o.status = buildClusterOperationStatus();
-    o.statusHistory = buildUnnamed518();
-    o.warnings = buildUnnamed519();
+    o.statusHistory = buildUnnamed517();
+    o.warnings = buildUnnamed518();
   }
   buildCounterClusterOperationMetadata--;
   return o;
@@ -302,11 +299,11 @@
     unittest.expect(o.clusterName, unittest.equals('foo'));
     unittest.expect(o.clusterUuid, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed517(o.labels);
+    checkUnnamed516(o.labels);
     unittest.expect(o.operationType, unittest.equals('foo'));
     checkClusterOperationStatus(o.status);
-    checkUnnamed518(o.statusHistory);
-    checkUnnamed519(o.warnings);
+    checkUnnamed517(o.statusHistory);
+    checkUnnamed518(o.warnings);
   }
   buildCounterClusterOperationMetadata--;
 }
@@ -365,16 +362,14 @@
 buildDiagnoseClusterRequest() {
   var o = new api.DiagnoseClusterRequest();
   buildCounterDiagnoseClusterRequest++;
-  if (buildCounterDiagnoseClusterRequest < 3) {
-  }
+  if (buildCounterDiagnoseClusterRequest < 3) {}
   buildCounterDiagnoseClusterRequest--;
   return o;
 }
 
 checkDiagnoseClusterRequest(api.DiagnoseClusterRequest o) {
   buildCounterDiagnoseClusterRequest++;
-  if (buildCounterDiagnoseClusterRequest < 3) {
-  }
+  if (buildCounterDiagnoseClusterRequest < 3) {}
   buildCounterDiagnoseClusterRequest--;
 }
 
@@ -422,32 +417,43 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed520() {
+buildUnnamed519() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed520(core.Map<core.String, core.String> o) {
+checkUnnamed519(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
+buildUnnamed520() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed520(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed521() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -461,6 +467,39 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterGceClusterConfig = 0;
+buildGceClusterConfig() {
+  var o = new api.GceClusterConfig();
+  buildCounterGceClusterConfig++;
+  if (buildCounterGceClusterConfig < 3) {
+    o.internalIpOnly = true;
+    o.metadata = buildUnnamed519();
+    o.networkUri = "foo";
+    o.serviceAccount = "foo";
+    o.serviceAccountScopes = buildUnnamed520();
+    o.subnetworkUri = "foo";
+    o.tags = buildUnnamed521();
+    o.zoneUri = "foo";
+  }
+  buildCounterGceClusterConfig--;
+  return o;
+}
+
+checkGceClusterConfig(api.GceClusterConfig o) {
+  buildCounterGceClusterConfig++;
+  if (buildCounterGceClusterConfig < 3) {
+    unittest.expect(o.internalIpOnly, unittest.isTrue);
+    checkUnnamed519(o.metadata);
+    unittest.expect(o.networkUri, unittest.equals('foo'));
+    unittest.expect(o.serviceAccount, unittest.equals('foo'));
+    checkUnnamed520(o.serviceAccountScopes);
+    unittest.expect(o.subnetworkUri, unittest.equals('foo'));
+    checkUnnamed521(o.tags);
+    unittest.expect(o.zoneUri, unittest.equals('foo'));
+  }
+  buildCounterGceClusterConfig--;
+}
+
 buildUnnamed522() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -474,39 +513,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterGceClusterConfig = 0;
-buildGceClusterConfig() {
-  var o = new api.GceClusterConfig();
-  buildCounterGceClusterConfig++;
-  if (buildCounterGceClusterConfig < 3) {
-    o.internalIpOnly = true;
-    o.metadata = buildUnnamed520();
-    o.networkUri = "foo";
-    o.serviceAccount = "foo";
-    o.serviceAccountScopes = buildUnnamed521();
-    o.subnetworkUri = "foo";
-    o.tags = buildUnnamed522();
-    o.zoneUri = "foo";
-  }
-  buildCounterGceClusterConfig--;
-  return o;
-}
-
-checkGceClusterConfig(api.GceClusterConfig o) {
-  buildCounterGceClusterConfig++;
-  if (buildCounterGceClusterConfig < 3) {
-    unittest.expect(o.internalIpOnly, unittest.isTrue);
-    checkUnnamed520(o.metadata);
-    unittest.expect(o.networkUri, unittest.equals('foo'));
-    unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkUnnamed521(o.serviceAccountScopes);
-    unittest.expect(o.subnetworkUri, unittest.equals('foo'));
-    checkUnnamed522(o.tags);
-    unittest.expect(o.zoneUri, unittest.equals('foo'));
-  }
-  buildCounterGceClusterConfig--;
-}
-
 buildUnnamed523() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -547,26 +553,13 @@
 }
 
 buildUnnamed526() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed526(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed527() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed527(core.Map<core.String, core.String> o) {
+checkUnnamed526(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -577,14 +570,14 @@
   var o = new api.HadoopJob();
   buildCounterHadoopJob++;
   if (buildCounterHadoopJob < 3) {
-    o.archiveUris = buildUnnamed523();
-    o.args = buildUnnamed524();
-    o.fileUris = buildUnnamed525();
-    o.jarFileUris = buildUnnamed526();
+    o.archiveUris = buildUnnamed522();
+    o.args = buildUnnamed523();
+    o.fileUris = buildUnnamed524();
+    o.jarFileUris = buildUnnamed525();
     o.loggingConfig = buildLoggingConfig();
     o.mainClass = "foo";
     o.mainJarFileUri = "foo";
-    o.properties = buildUnnamed527();
+    o.properties = buildUnnamed526();
   }
   buildCounterHadoopJob--;
   return o;
@@ -593,31 +586,44 @@
 checkHadoopJob(api.HadoopJob o) {
   buildCounterHadoopJob++;
   if (buildCounterHadoopJob < 3) {
-    checkUnnamed523(o.archiveUris);
-    checkUnnamed524(o.args);
-    checkUnnamed525(o.fileUris);
-    checkUnnamed526(o.jarFileUris);
+    checkUnnamed522(o.archiveUris);
+    checkUnnamed523(o.args);
+    checkUnnamed524(o.fileUris);
+    checkUnnamed525(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
     unittest.expect(o.mainClass, unittest.equals('foo'));
     unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
-    checkUnnamed527(o.properties);
+    checkUnnamed526(o.properties);
   }
   buildCounterHadoopJob--;
 }
 
-buildUnnamed528() {
+buildUnnamed527() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed528(core.List<core.String> o) {
+checkUnnamed527(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed528() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed528(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 buildUnnamed529() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -631,30 +637,17 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed530() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed530(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
 core.int buildCounterHiveJob = 0;
 buildHiveJob() {
   var o = new api.HiveJob();
   buildCounterHiveJob++;
   if (buildCounterHiveJob < 3) {
     o.continueOnFailure = true;
-    o.jarFileUris = buildUnnamed528();
-    o.properties = buildUnnamed529();
+    o.jarFileUris = buildUnnamed527();
+    o.properties = buildUnnamed528();
     o.queryFileUri = "foo";
     o.queryList = buildQueryList();
-    o.scriptVariables = buildUnnamed530();
+    o.scriptVariables = buildUnnamed529();
   }
   buildCounterHiveJob--;
   return o;
@@ -664,36 +657,36 @@
   buildCounterHiveJob++;
   if (buildCounterHiveJob < 3) {
     unittest.expect(o.continueOnFailure, unittest.isTrue);
-    checkUnnamed528(o.jarFileUris);
-    checkUnnamed529(o.properties);
+    checkUnnamed527(o.jarFileUris);
+    checkUnnamed528(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
     checkQueryList(o.queryList);
-    checkUnnamed530(o.scriptVariables);
+    checkUnnamed529(o.scriptVariables);
   }
   buildCounterHiveJob--;
 }
 
-buildUnnamed531() {
+buildUnnamed530() {
   var o = new core.List<api.AcceleratorConfig>();
   o.add(buildAcceleratorConfig());
   o.add(buildAcceleratorConfig());
   return o;
 }
 
-checkUnnamed531(core.List<api.AcceleratorConfig> o) {
+checkUnnamed530(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAcceleratorConfig(o[0]);
   checkAcceleratorConfig(o[1]);
 }
 
-buildUnnamed532() {
+buildUnnamed531() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed532(core.List<core.String> o) {
+checkUnnamed531(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -704,10 +697,10 @@
   var o = new api.InstanceGroupConfig();
   buildCounterInstanceGroupConfig++;
   if (buildCounterInstanceGroupConfig < 3) {
-    o.accelerators = buildUnnamed531();
+    o.accelerators = buildUnnamed530();
     o.diskConfig = buildDiskConfig();
     o.imageUri = "foo";
-    o.instanceNames = buildUnnamed532();
+    o.instanceNames = buildUnnamed531();
     o.isPreemptible = true;
     o.machineTypeUri = "foo";
     o.managedGroupConfig = buildManagedGroupConfig();
@@ -720,10 +713,10 @@
 checkInstanceGroupConfig(api.InstanceGroupConfig o) {
   buildCounterInstanceGroupConfig++;
   if (buildCounterInstanceGroupConfig < 3) {
-    checkUnnamed531(o.accelerators);
+    checkUnnamed530(o.accelerators);
     checkDiskConfig(o.diskConfig);
     unittest.expect(o.imageUri, unittest.equals('foo'));
-    checkUnnamed532(o.instanceNames);
+    checkUnnamed531(o.instanceNames);
     unittest.expect(o.isPreemptible, unittest.isTrue);
     unittest.expect(o.machineTypeUri, unittest.equals('foo'));
     checkManagedGroupConfig(o.managedGroupConfig);
@@ -732,40 +725,40 @@
   buildCounterInstanceGroupConfig--;
 }
 
-buildUnnamed533() {
+buildUnnamed532() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed533(core.Map<core.String, core.String> o) {
+checkUnnamed532(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed534() {
+buildUnnamed533() {
   var o = new core.List<api.JobStatus>();
   o.add(buildJobStatus());
   o.add(buildJobStatus());
   return o;
 }
 
-checkUnnamed534(core.List<api.JobStatus> o) {
+checkUnnamed533(core.List<api.JobStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobStatus(o[0]);
   checkJobStatus(o[1]);
 }
 
-buildUnnamed535() {
+buildUnnamed534() {
   var o = new core.List<api.YarnApplication>();
   o.add(buildYarnApplication());
   o.add(buildYarnApplication());
   return o;
 }
 
-checkUnnamed535(core.List<api.YarnApplication> o) {
+checkUnnamed534(core.List<api.YarnApplication> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkYarnApplication(o[0]);
   checkYarnApplication(o[1]);
@@ -780,7 +773,7 @@
     o.driverOutputResourceUri = "foo";
     o.hadoopJob = buildHadoopJob();
     o.hiveJob = buildHiveJob();
-    o.labels = buildUnnamed533();
+    o.labels = buildUnnamed532();
     o.pigJob = buildPigJob();
     o.placement = buildJobPlacement();
     o.pysparkJob = buildPySparkJob();
@@ -789,8 +782,8 @@
     o.sparkJob = buildSparkJob();
     o.sparkSqlJob = buildSparkSqlJob();
     o.status = buildJobStatus();
-    o.statusHistory = buildUnnamed534();
-    o.yarnApplications = buildUnnamed535();
+    o.statusHistory = buildUnnamed533();
+    o.yarnApplications = buildUnnamed534();
   }
   buildCounterJob--;
   return o;
@@ -803,7 +796,7 @@
     unittest.expect(o.driverOutputResourceUri, unittest.equals('foo'));
     checkHadoopJob(o.hadoopJob);
     checkHiveJob(o.hiveJob);
-    checkUnnamed533(o.labels);
+    checkUnnamed532(o.labels);
     checkPigJob(o.pigJob);
     checkJobPlacement(o.placement);
     checkPySparkJob(o.pysparkJob);
@@ -812,8 +805,8 @@
     checkSparkJob(o.sparkJob);
     checkSparkSqlJob(o.sparkSqlJob);
     checkJobStatus(o.status);
-    checkUnnamed534(o.statusHistory);
-    checkUnnamed535(o.yarnApplications);
+    checkUnnamed533(o.statusHistory);
+    checkUnnamed534(o.yarnApplications);
   }
   buildCounterJob--;
 }
@@ -904,14 +897,14 @@
   buildCounterJobStatus--;
 }
 
-buildUnnamed536() {
+buildUnnamed535() {
   var o = new core.List<api.Cluster>();
   o.add(buildCluster());
   o.add(buildCluster());
   return o;
 }
 
-checkUnnamed536(core.List<api.Cluster> o) {
+checkUnnamed535(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCluster(o[0]);
   checkCluster(o[1]);
@@ -922,7 +915,7 @@
   var o = new api.ListClustersResponse();
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    o.clusters = buildUnnamed536();
+    o.clusters = buildUnnamed535();
     o.nextPageToken = "foo";
   }
   buildCounterListClustersResponse--;
@@ -932,20 +925,20 @@
 checkListClustersResponse(api.ListClustersResponse o) {
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    checkUnnamed536(o.clusters);
+    checkUnnamed535(o.clusters);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListClustersResponse--;
 }
 
-buildUnnamed537() {
+buildUnnamed536() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed537(core.List<api.Job> o) {
+checkUnnamed536(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -956,7 +949,7 @@
   var o = new api.ListJobsResponse();
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    o.jobs = buildUnnamed537();
+    o.jobs = buildUnnamed536();
     o.nextPageToken = "foo";
   }
   buildCounterListJobsResponse--;
@@ -966,20 +959,20 @@
 checkListJobsResponse(api.ListJobsResponse o) {
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    checkUnnamed537(o.jobs);
+    checkUnnamed536(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListJobsResponse--;
 }
 
-buildUnnamed538() {
+buildUnnamed537() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed538(core.List<api.Operation> o) {
+checkUnnamed537(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -991,7 +984,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed538();
+    o.operations = buildUnnamed537();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1001,19 +994,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed538(o.operations);
+    checkUnnamed537(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed539() {
+buildUnnamed538() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed539(core.Map<core.String, core.String> o) {
+checkUnnamed538(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1024,7 +1017,7 @@
   var o = new api.LoggingConfig();
   buildCounterLoggingConfig++;
   if (buildCounterLoggingConfig < 3) {
-    o.driverLogLevels = buildUnnamed539();
+    o.driverLogLevels = buildUnnamed538();
   }
   buildCounterLoggingConfig--;
   return o;
@@ -1033,7 +1026,7 @@
 checkLoggingConfig(api.LoggingConfig o) {
   buildCounterLoggingConfig++;
   if (buildCounterLoggingConfig < 3) {
-    checkUnnamed539(o.driverLogLevels);
+    checkUnnamed538(o.driverLogLevels);
   }
   buildCounterLoggingConfig--;
 }
@@ -1080,30 +1073,62 @@
   buildCounterNodeInitializationAction--;
 }
 
+buildUnnamed539() {
+  var o = new core.Map<core.String, core.Object>();
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  return o;
+}
+
+checkUnnamed539(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
+}
+
 buildUnnamed540() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
 checkUnnamed540(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
-}
-
-buildUnnamed541() {
-  var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  return o;
-}
-
-checkUnnamed541(core.Map<core.String, core.Object> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -1113,9 +1138,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed540();
+    o.metadata = buildUnnamed539();
     o.name = "foo";
-    o.response = buildUnnamed541();
+    o.response = buildUnnamed540();
   }
   buildCounterOperation--;
   return o;
@@ -1126,26 +1151,39 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed540(o.metadata);
+    checkUnnamed539(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed541(o.response);
+    checkUnnamed540(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed542() {
+buildUnnamed541() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed542(core.List<core.String> o) {
+checkUnnamed541(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed542() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed542(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 buildUnnamed543() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -1159,31 +1197,18 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed544() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed544(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
 core.int buildCounterPigJob = 0;
 buildPigJob() {
   var o = new api.PigJob();
   buildCounterPigJob++;
   if (buildCounterPigJob < 3) {
     o.continueOnFailure = true;
-    o.jarFileUris = buildUnnamed542();
+    o.jarFileUris = buildUnnamed541();
     o.loggingConfig = buildLoggingConfig();
-    o.properties = buildUnnamed543();
+    o.properties = buildUnnamed542();
     o.queryFileUri = "foo";
     o.queryList = buildQueryList();
-    o.scriptVariables = buildUnnamed544();
+    o.scriptVariables = buildUnnamed543();
   }
   buildCounterPigJob--;
   return o;
@@ -1193,16 +1218,29 @@
   buildCounterPigJob++;
   if (buildCounterPigJob < 3) {
     unittest.expect(o.continueOnFailure, unittest.isTrue);
-    checkUnnamed542(o.jarFileUris);
+    checkUnnamed541(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
-    checkUnnamed543(o.properties);
+    checkUnnamed542(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
     checkQueryList(o.queryList);
-    checkUnnamed544(o.scriptVariables);
+    checkUnnamed543(o.scriptVariables);
   }
   buildCounterPigJob--;
 }
 
+buildUnnamed544() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed544(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed545() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1243,31 +1281,64 @@
 }
 
 buildUnnamed548() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed548(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed549() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed549(core.Map<core.String, core.String> o) {
+checkUnnamed548(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
+buildUnnamed549() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed549(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterPySparkJob = 0;
+buildPySparkJob() {
+  var o = new api.PySparkJob();
+  buildCounterPySparkJob++;
+  if (buildCounterPySparkJob < 3) {
+    o.archiveUris = buildUnnamed544();
+    o.args = buildUnnamed545();
+    o.fileUris = buildUnnamed546();
+    o.jarFileUris = buildUnnamed547();
+    o.loggingConfig = buildLoggingConfig();
+    o.mainPythonFileUri = "foo";
+    o.properties = buildUnnamed548();
+    o.pythonFileUris = buildUnnamed549();
+  }
+  buildCounterPySparkJob--;
+  return o;
+}
+
+checkPySparkJob(api.PySparkJob o) {
+  buildCounterPySparkJob++;
+  if (buildCounterPySparkJob < 3) {
+    checkUnnamed544(o.archiveUris);
+    checkUnnamed545(o.args);
+    checkUnnamed546(o.fileUris);
+    checkUnnamed547(o.jarFileUris);
+    checkLoggingConfig(o.loggingConfig);
+    unittest.expect(o.mainPythonFileUri, unittest.equals('foo'));
+    checkUnnamed548(o.properties);
+    checkUnnamed549(o.pythonFileUris);
+  }
+  buildCounterPySparkJob--;
+}
+
 buildUnnamed550() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1281,58 +1352,12 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterPySparkJob = 0;
-buildPySparkJob() {
-  var o = new api.PySparkJob();
-  buildCounterPySparkJob++;
-  if (buildCounterPySparkJob < 3) {
-    o.archiveUris = buildUnnamed545();
-    o.args = buildUnnamed546();
-    o.fileUris = buildUnnamed547();
-    o.jarFileUris = buildUnnamed548();
-    o.loggingConfig = buildLoggingConfig();
-    o.mainPythonFileUri = "foo";
-    o.properties = buildUnnamed549();
-    o.pythonFileUris = buildUnnamed550();
-  }
-  buildCounterPySparkJob--;
-  return o;
-}
-
-checkPySparkJob(api.PySparkJob o) {
-  buildCounterPySparkJob++;
-  if (buildCounterPySparkJob < 3) {
-    checkUnnamed545(o.archiveUris);
-    checkUnnamed546(o.args);
-    checkUnnamed547(o.fileUris);
-    checkUnnamed548(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
-    unittest.expect(o.mainPythonFileUri, unittest.equals('foo'));
-    checkUnnamed549(o.properties);
-    checkUnnamed550(o.pythonFileUris);
-  }
-  buildCounterPySparkJob--;
-}
-
-buildUnnamed551() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed551(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterQueryList = 0;
 buildQueryList() {
   var o = new api.QueryList();
   buildCounterQueryList++;
   if (buildCounterQueryList < 3) {
-    o.queries = buildUnnamed551();
+    o.queries = buildUnnamed550();
   }
   buildCounterQueryList--;
   return o;
@@ -1341,19 +1366,19 @@
 checkQueryList(api.QueryList o) {
   buildCounterQueryList++;
   if (buildCounterQueryList < 3) {
-    checkUnnamed551(o.queries);
+    checkUnnamed550(o.queries);
   }
   buildCounterQueryList--;
 }
 
-buildUnnamed552() {
+buildUnnamed551() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed552(core.Map<core.String, core.String> o) {
+checkUnnamed551(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1365,7 +1390,7 @@
   buildCounterSoftwareConfig++;
   if (buildCounterSoftwareConfig < 3) {
     o.imageVersion = "foo";
-    o.properties = buildUnnamed552();
+    o.properties = buildUnnamed551();
   }
   buildCounterSoftwareConfig--;
   return o;
@@ -1375,11 +1400,24 @@
   buildCounterSoftwareConfig++;
   if (buildCounterSoftwareConfig < 3) {
     unittest.expect(o.imageVersion, unittest.equals('foo'));
-    checkUnnamed552(o.properties);
+    checkUnnamed551(o.properties);
   }
   buildCounterSoftwareConfig--;
 }
 
+buildUnnamed552() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed552(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed553() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1420,26 +1458,13 @@
 }
 
 buildUnnamed556() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed556(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed557() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed557(core.Map<core.String, core.String> o) {
+checkUnnamed556(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1450,14 +1475,14 @@
   var o = new api.SparkJob();
   buildCounterSparkJob++;
   if (buildCounterSparkJob < 3) {
-    o.archiveUris = buildUnnamed553();
-    o.args = buildUnnamed554();
-    o.fileUris = buildUnnamed555();
-    o.jarFileUris = buildUnnamed556();
+    o.archiveUris = buildUnnamed552();
+    o.args = buildUnnamed553();
+    o.fileUris = buildUnnamed554();
+    o.jarFileUris = buildUnnamed555();
     o.loggingConfig = buildLoggingConfig();
     o.mainClass = "foo";
     o.mainJarFileUri = "foo";
-    o.properties = buildUnnamed557();
+    o.properties = buildUnnamed556();
   }
   buildCounterSparkJob--;
   return o;
@@ -1466,31 +1491,44 @@
 checkSparkJob(api.SparkJob o) {
   buildCounterSparkJob++;
   if (buildCounterSparkJob < 3) {
-    checkUnnamed553(o.archiveUris);
-    checkUnnamed554(o.args);
-    checkUnnamed555(o.fileUris);
-    checkUnnamed556(o.jarFileUris);
+    checkUnnamed552(o.archiveUris);
+    checkUnnamed553(o.args);
+    checkUnnamed554(o.fileUris);
+    checkUnnamed555(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
     unittest.expect(o.mainClass, unittest.equals('foo'));
     unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
-    checkUnnamed557(o.properties);
+    checkUnnamed556(o.properties);
   }
   buildCounterSparkJob--;
 }
 
-buildUnnamed558() {
+buildUnnamed557() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed558(core.List<core.String> o) {
+checkUnnamed557(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed558() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed558(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 buildUnnamed559() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -1504,30 +1542,17 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed560() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed560(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
 core.int buildCounterSparkSqlJob = 0;
 buildSparkSqlJob() {
   var o = new api.SparkSqlJob();
   buildCounterSparkSqlJob++;
   if (buildCounterSparkSqlJob < 3) {
-    o.jarFileUris = buildUnnamed558();
+    o.jarFileUris = buildUnnamed557();
     o.loggingConfig = buildLoggingConfig();
-    o.properties = buildUnnamed559();
+    o.properties = buildUnnamed558();
     o.queryFileUri = "foo";
     o.queryList = buildQueryList();
-    o.scriptVariables = buildUnnamed560();
+    o.scriptVariables = buildUnnamed559();
   }
   buildCounterSparkSqlJob--;
   return o;
@@ -1536,40 +1561,56 @@
 checkSparkSqlJob(api.SparkSqlJob o) {
   buildCounterSparkSqlJob++;
   if (buildCounterSparkSqlJob < 3) {
-    checkUnnamed558(o.jarFileUris);
+    checkUnnamed557(o.jarFileUris);
     checkLoggingConfig(o.loggingConfig);
-    checkUnnamed559(o.properties);
+    checkUnnamed558(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
     checkQueryList(o.queryList);
-    checkUnnamed560(o.scriptVariables);
+    checkUnnamed559(o.scriptVariables);
   }
   buildCounterSparkSqlJob--;
 }
 
-buildUnnamed561() {
+buildUnnamed560() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed561(core.Map<core.String, core.Object> o) {
+checkUnnamed560(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed562() {
+buildUnnamed561() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed561());
-  o.add(buildUnnamed561());
+  o.add(buildUnnamed560());
+  o.add(buildUnnamed560());
   return o;
 }
 
-checkUnnamed562(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed561(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed561(o[0]);
-  checkUnnamed561(o[1]);
+  checkUnnamed560(o[0]);
+  checkUnnamed560(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1578,7 +1619,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed562();
+    o.details = buildUnnamed561();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1589,7 +1630,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed562(o.details);
+    checkUnnamed561(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1639,7 +1680,6 @@
   buildCounterYarnApplication--;
 }
 
-
 main() {
   unittest.group("obj-schema-AcceleratorConfig", () {
     unittest.test("to-json--from-json", () {
@@ -1649,7 +1689,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CancelJobRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCancelJobRequest();
@@ -1658,7 +1697,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Cluster", () {
     unittest.test("to-json--from-json", () {
       var o = buildCluster();
@@ -1667,7 +1705,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClusterConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildClusterConfig();
@@ -1676,7 +1713,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClusterMetrics", () {
     unittest.test("to-json--from-json", () {
       var o = buildClusterMetrics();
@@ -1685,7 +1721,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClusterOperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildClusterOperationMetadata();
@@ -1694,7 +1729,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClusterOperationStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildClusterOperationStatus();
@@ -1703,7 +1737,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClusterStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildClusterStatus();
@@ -1712,7 +1745,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiagnoseClusterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiagnoseClusterRequest();
@@ -1721,7 +1753,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiagnoseClusterResults", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiagnoseClusterResults();
@@ -1730,7 +1761,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DiskConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiskConfig();
@@ -1739,7 +1769,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -1748,7 +1777,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GceClusterConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildGceClusterConfig();
@@ -1757,7 +1785,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HadoopJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildHadoopJob();
@@ -1766,7 +1793,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HiveJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildHiveJob();
@@ -1775,7 +1801,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceGroupConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceGroupConfig();
@@ -1784,7 +1809,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Job", () {
     unittest.test("to-json--from-json", () {
       var o = buildJob();
@@ -1793,7 +1817,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JobPlacement", () {
     unittest.test("to-json--from-json", () {
       var o = buildJobPlacement();
@@ -1802,7 +1825,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JobReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildJobReference();
@@ -1811,7 +1833,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JobScheduling", () {
     unittest.test("to-json--from-json", () {
       var o = buildJobScheduling();
@@ -1820,7 +1841,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JobStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildJobStatus();
@@ -1829,7 +1849,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListClustersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListClustersResponse();
@@ -1838,7 +1857,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListJobsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListJobsResponse();
@@ -1847,7 +1865,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -1856,7 +1873,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LoggingConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildLoggingConfig();
@@ -1865,7 +1881,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedGroupConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedGroupConfig();
@@ -1874,7 +1889,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NodeInitializationAction", () {
     unittest.test("to-json--from-json", () {
       var o = buildNodeInitializationAction();
@@ -1883,7 +1897,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1892,7 +1905,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PigJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildPigJob();
@@ -1901,7 +1913,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PySparkJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildPySparkJob();
@@ -1910,7 +1921,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QueryList", () {
     unittest.test("to-json--from-json", () {
       var o = buildQueryList();
@@ -1919,7 +1929,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SoftwareConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildSoftwareConfig();
@@ -1928,7 +1937,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SparkJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildSparkJob();
@@ -1937,7 +1945,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SparkSqlJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildSparkSqlJob();
@@ -1946,7 +1953,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1955,7 +1961,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubmitJobRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubmitJobRequest();
@@ -1964,7 +1969,6 @@
     });
   });
 
-
   unittest.group("obj-schema-YarnApplication", () {
     unittest.test("to-json--from-json", () {
       var o = buildYarnApplication();
@@ -1973,12 +1977,11 @@
     });
   });
 
-
   unittest.group("resource-ProjectsRegionsClustersResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsClustersResourceApi res = new api.DataprocApi(mock).projects.regions.clusters;
+      api.ProjectsRegionsClustersResourceApi res =
+          new api.DataprocApi(mock).projects.regions.clusters;
       var arg_request = buildCluster();
       var arg_projectId = "foo";
       var arg_region = "foo";
@@ -1990,23 +1993,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/clusters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/clusters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/clusters"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2019,29 +2028,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_projectId, arg_region).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_projectId, arg_region)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsClustersResourceApi res = new api.DataprocApi(mock).projects.regions.clusters;
+      api.ProjectsRegionsClustersResourceApi res =
+          new api.DataprocApi(mock).projects.regions.clusters;
       var arg_projectId = "foo";
       var arg_region = "foo";
       var arg_clusterName = "foo";
@@ -2050,23 +2062,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2082,29 +2100,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_projectId, arg_region, arg_clusterName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_projectId, arg_region, arg_clusterName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--diagnose", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsClustersResourceApi res = new api.DataprocApi(mock).projects.regions.clusters;
+      api.ProjectsRegionsClustersResourceApi res =
+          new api.DataprocApi(mock).projects.regions.clusters;
       var arg_request = buildDiagnoseClusterRequest();
       var arg_projectId = "foo";
       var arg_region = "foo";
@@ -2117,30 +2138,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         index = path.indexOf(":diagnose", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_clusterName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":diagnose"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":diagnose"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2153,29 +2182,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.diagnose(arg_request, arg_projectId, arg_region, arg_clusterName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .diagnose(arg_request, arg_projectId, arg_region, arg_clusterName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsClustersResourceApi res = new api.DataprocApi(mock).projects.regions.clusters;
+      api.ProjectsRegionsClustersResourceApi res =
+          new api.DataprocApi(mock).projects.regions.clusters;
       var arg_projectId = "foo";
       var arg_region = "foo";
       var arg_clusterName = "foo";
@@ -2184,23 +2216,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2216,56 +2254,65 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCluster());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_region, arg_clusterName).then(unittest.expectAsync1(((api.Cluster response) {
+      res
+          .get(arg_projectId, arg_region, arg_clusterName)
+          .then(unittest.expectAsync1(((api.Cluster response) {
         checkCluster(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsClustersResourceApi res = new api.DataprocApi(mock).projects.regions.clusters;
+      api.ProjectsRegionsClustersResourceApi res =
+          new api.DataprocApi(mock).projects.regions.clusters;
       var arg_projectId = "foo";
       var arg_region = "foo";
-      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/clusters", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/clusters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/clusters"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2278,32 +2325,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListClustersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, arg_region, pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListClustersResponse response) {
+      res
+          .list(arg_projectId, arg_region,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListClustersResponse response) {
         checkListClustersResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsClustersResourceApi res = new api.DataprocApi(mock).projects.regions.clusters;
+      api.ProjectsRegionsClustersResourceApi res =
+          new api.DataprocApi(mock).projects.regions.clusters;
       var arg_request = buildCluster();
       var arg_projectId = "foo";
       var arg_region = "foo";
@@ -2317,23 +2372,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/clusters/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/clusters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/clusters/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2349,34 +2410,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_projectId, arg_region, arg_clusterName, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_projectId, arg_region, arg_clusterName,
+              updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsRegionsJobsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsJobsResourceApi res = new api.DataprocApi(mock).projects.regions.jobs;
+      api.ProjectsRegionsJobsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.jobs;
       var arg_request = buildCancelJobRequest();
       var arg_projectId = "foo";
       var arg_region = "foo";
@@ -2389,30 +2453,38 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/jobs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/jobs/"));
         pathOffset += 6;
         index = path.indexOf(":cancel", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_jobId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":cancel"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":cancel"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2425,29 +2497,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_projectId, arg_region, arg_jobId).then(unittest.expectAsync1(((api.Job response) {
+      res
+          .cancel(arg_request, arg_projectId, arg_region, arg_jobId)
+          .then(unittest.expectAsync1(((api.Job response) {
         checkJob(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsJobsResourceApi res = new api.DataprocApi(mock).projects.regions.jobs;
+      api.ProjectsRegionsJobsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.jobs;
       var arg_projectId = "foo";
       var arg_region = "foo";
       var arg_jobId = "foo";
@@ -2456,23 +2531,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/jobs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/jobs/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2488,29 +2569,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_projectId, arg_region, arg_jobId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_projectId, arg_region, arg_jobId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsJobsResourceApi res = new api.DataprocApi(mock).projects.regions.jobs;
+      api.ProjectsRegionsJobsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.jobs;
       var arg_projectId = "foo";
       var arg_region = "foo";
       var arg_jobId = "foo";
@@ -2519,23 +2603,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/jobs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/jobs/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2551,58 +2641,67 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId, arg_region, arg_jobId).then(unittest.expectAsync1(((api.Job response) {
+      res
+          .get(arg_projectId, arg_region, arg_jobId)
+          .then(unittest.expectAsync1(((api.Job response) {
         checkJob(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsJobsResourceApi res = new api.DataprocApi(mock).projects.regions.jobs;
+      api.ProjectsRegionsJobsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.jobs;
       var arg_projectId = "foo";
       var arg_region = "foo";
-      var arg_filter = "foo";
-      var arg_jobStateMatcher = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_clusterName = "foo";
+      var arg_filter = "foo";
+      var arg_jobStateMatcher = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/jobs", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/jobs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/jobs"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -2615,34 +2714,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["clusterName"].first, unittest.equals(arg_clusterName));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["jobStateMatcher"].first, unittest.equals(arg_jobStateMatcher));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["clusterName"].first, unittest.equals(arg_clusterName));
-
+        unittest.expect(queryMap["jobStateMatcher"].first,
+            unittest.equals(arg_jobStateMatcher));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListJobsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_projectId, arg_region, filter: arg_filter, jobStateMatcher: arg_jobStateMatcher, pageToken: arg_pageToken, pageSize: arg_pageSize, clusterName: arg_clusterName).then(unittest.expectAsync1(((api.ListJobsResponse response) {
+      res
+          .list(arg_projectId, arg_region,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              clusterName: arg_clusterName,
+              filter: arg_filter,
+              jobStateMatcher: arg_jobStateMatcher)
+          .then(unittest.expectAsync1(((api.ListJobsResponse response) {
         checkListJobsResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsJobsResourceApi res = new api.DataprocApi(mock).projects.regions.jobs;
+      api.ProjectsRegionsJobsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.jobs;
       var arg_request = buildJob();
       var arg_projectId = "foo";
       var arg_region = "foo";
@@ -2656,23 +2767,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/jobs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/jobs/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2688,30 +2805,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_projectId, arg_region, arg_jobId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Job response) {
+      res
+          .patch(arg_request, arg_projectId, arg_region, arg_jobId,
+              updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Job response) {
         checkJob(response);
       })));
     });
 
     unittest.test("method--submit", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsJobsResourceApi res = new api.DataprocApi(mock).projects.regions.jobs;
+      api.ProjectsRegionsJobsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.jobs;
       var arg_request = buildSubmitJobRequest();
       var arg_projectId = "foo";
       var arg_region = "foo";
@@ -2723,23 +2845,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf("/regions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/regions/"));
         pathOffset += 9;
         index = path.indexOf("/jobs:submit", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/jobs:submit"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/jobs:submit"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -2752,42 +2880,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.submit(arg_request, arg_projectId, arg_region).then(unittest.expectAsync1(((api.Job response) {
+      res
+          .submit(arg_request, arg_projectId, arg_region)
+          .then(unittest.expectAsync1(((api.Job response) {
         checkJob(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsRegionsOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsOperationsResourceApi res = new api.DataprocApi(mock).projects.regions.operations;
+      api.ProjectsRegionsOperationsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2801,16 +2932,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2821,18 +2953,20 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsOperationsResourceApi res = new api.DataprocApi(mock).projects.regions.operations;
+      api.ProjectsRegionsOperationsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2846,16 +2980,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2866,18 +3001,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsOperationsResourceApi res = new api.DataprocApi(mock).projects.regions.operations;
+      api.ProjectsRegionsOperationsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2891,16 +3028,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2911,21 +3049,23 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRegionsOperationsResourceApi res = new api.DataprocApi(mock).projects.regions.operations;
+      api.ProjectsRegionsOperationsResourceApi res =
+          new api.DataprocApi(mock).projects.regions.operations;
       var arg_name = "foo";
-      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2939,30 +3079,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/datastore/v1_test.dart b/generated/googleapis/test/datastore/v1_test.dart
index 8755ef8..addc18e 100644
--- a/generated/googleapis/test/datastore/v1_test.dart
+++ b/generated/googleapis/test/datastore/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.datastore.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/datastore/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,12 +44,44 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
+buildUnnamed630() {
+  var o = new core.List<api.Key>();
+  o.add(buildKey());
+  o.add(buildKey());
+  return o;
+}
+
+checkUnnamed630(core.List<api.Key> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkKey(o[0]);
+  checkKey(o[1]);
+}
+
+core.int buildCounterAllocateIdsRequest = 0;
+buildAllocateIdsRequest() {
+  var o = new api.AllocateIdsRequest();
+  buildCounterAllocateIdsRequest++;
+  if (buildCounterAllocateIdsRequest < 3) {
+    o.keys = buildUnnamed630();
+  }
+  buildCounterAllocateIdsRequest--;
+  return o;
+}
+
+checkAllocateIdsRequest(api.AllocateIdsRequest o) {
+  buildCounterAllocateIdsRequest++;
+  if (buildCounterAllocateIdsRequest < 3) {
+    checkUnnamed630(o.keys);
+  }
+  buildCounterAllocateIdsRequest--;
+}
+
 buildUnnamed631() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
@@ -64,44 +95,12 @@
   checkKey(o[1]);
 }
 
-core.int buildCounterAllocateIdsRequest = 0;
-buildAllocateIdsRequest() {
-  var o = new api.AllocateIdsRequest();
-  buildCounterAllocateIdsRequest++;
-  if (buildCounterAllocateIdsRequest < 3) {
-    o.keys = buildUnnamed631();
-  }
-  buildCounterAllocateIdsRequest--;
-  return o;
-}
-
-checkAllocateIdsRequest(api.AllocateIdsRequest o) {
-  buildCounterAllocateIdsRequest++;
-  if (buildCounterAllocateIdsRequest < 3) {
-    checkUnnamed631(o.keys);
-  }
-  buildCounterAllocateIdsRequest--;
-}
-
-buildUnnamed632() {
-  var o = new core.List<api.Key>();
-  o.add(buildKey());
-  o.add(buildKey());
-  return o;
-}
-
-checkUnnamed632(core.List<api.Key> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
-}
-
 core.int buildCounterAllocateIdsResponse = 0;
 buildAllocateIdsResponse() {
   var o = new api.AllocateIdsResponse();
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
-    o.keys = buildUnnamed632();
+    o.keys = buildUnnamed631();
   }
   buildCounterAllocateIdsResponse--;
   return o;
@@ -110,19 +109,19 @@
 checkAllocateIdsResponse(api.AllocateIdsResponse o) {
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
-    checkUnnamed632(o.keys);
+    checkUnnamed631(o.keys);
   }
   buildCounterAllocateIdsResponse--;
 }
 
-buildUnnamed633() {
+buildUnnamed632() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed633(core.List<api.Value> o) {
+checkUnnamed632(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -133,7 +132,7 @@
   var o = new api.ArrayValue();
   buildCounterArrayValue++;
   if (buildCounterArrayValue < 3) {
-    o.values = buildUnnamed633();
+    o.values = buildUnnamed632();
   }
   buildCounterArrayValue--;
   return o;
@@ -142,7 +141,7 @@
 checkArrayValue(api.ArrayValue o) {
   buildCounterArrayValue++;
   if (buildCounterArrayValue < 3) {
-    checkUnnamed633(o.values);
+    checkUnnamed632(o.values);
   }
   buildCounterArrayValue--;
 }
@@ -185,14 +184,14 @@
   buildCounterBeginTransactionResponse--;
 }
 
-buildUnnamed634() {
+buildUnnamed633() {
   var o = new core.List<api.Mutation>();
   o.add(buildMutation());
   o.add(buildMutation());
   return o;
 }
 
-checkUnnamed634(core.List<api.Mutation> o) {
+checkUnnamed633(core.List<api.Mutation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMutation(o[0]);
   checkMutation(o[1]);
@@ -204,7 +203,7 @@
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
     o.mode = "foo";
-    o.mutations = buildUnnamed634();
+    o.mutations = buildUnnamed633();
     o.transaction = "foo";
   }
   buildCounterCommitRequest--;
@@ -215,20 +214,20 @@
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
     unittest.expect(o.mode, unittest.equals('foo'));
-    checkUnnamed634(o.mutations);
+    checkUnnamed633(o.mutations);
     unittest.expect(o.transaction, unittest.equals('foo'));
   }
   buildCounterCommitRequest--;
 }
 
-buildUnnamed635() {
+buildUnnamed634() {
   var o = new core.List<api.MutationResult>();
   o.add(buildMutationResult());
   o.add(buildMutationResult());
   return o;
 }
 
-checkUnnamed635(core.List<api.MutationResult> o) {
+checkUnnamed634(core.List<api.MutationResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMutationResult(o[0]);
   checkMutationResult(o[1]);
@@ -240,7 +239,7 @@
   buildCounterCommitResponse++;
   if (buildCounterCommitResponse < 3) {
     o.indexUpdates = 42;
-    o.mutationResults = buildUnnamed635();
+    o.mutationResults = buildUnnamed634();
   }
   buildCounterCommitResponse--;
   return o;
@@ -250,19 +249,19 @@
   buildCounterCommitResponse++;
   if (buildCounterCommitResponse < 3) {
     unittest.expect(o.indexUpdates, unittest.equals(42));
-    checkUnnamed635(o.mutationResults);
+    checkUnnamed634(o.mutationResults);
   }
   buildCounterCommitResponse--;
 }
 
-buildUnnamed636() {
+buildUnnamed635() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed636(core.List<api.Filter> o) {
+checkUnnamed635(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -273,7 +272,7 @@
   var o = new api.CompositeFilter();
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    o.filters = buildUnnamed636();
+    o.filters = buildUnnamed635();
     o.op = "foo";
   }
   buildCounterCompositeFilter--;
@@ -283,7 +282,7 @@
 checkCompositeFilter(api.CompositeFilter o) {
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    checkUnnamed636(o.filters);
+    checkUnnamed635(o.filters);
     unittest.expect(o.op, unittest.equals('foo'));
   }
   buildCounterCompositeFilter--;
@@ -293,27 +292,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed637() {
+buildUnnamed636() {
   var o = new core.Map<core.String, api.Value>();
   o["x"] = buildValue();
   o["y"] = buildValue();
   return o;
 }
 
-checkUnnamed637(core.Map<core.String, api.Value> o) {
+checkUnnamed636(core.Map<core.String, api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o["x"]);
   checkValue(o["y"]);
@@ -325,7 +322,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     o.key = buildKey();
-    o.properties = buildUnnamed637();
+    o.properties = buildUnnamed636();
   }
   buildCounterEntity--;
   return o;
@@ -335,7 +332,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     checkKey(o.key);
-    checkUnnamed637(o.properties);
+    checkUnnamed636(o.properties);
   }
   buildCounterEntity--;
 }
@@ -384,14 +381,14 @@
   buildCounterFilter--;
 }
 
-buildUnnamed638() {
+buildUnnamed637() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed638(core.Map<core.String, core.String> o) {
+checkUnnamed637(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -403,7 +400,7 @@
   buildCounterGoogleDatastoreAdminV1beta1CommonMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1CommonMetadata < 3) {
     o.endTime = "foo";
-    o.labels = buildUnnamed638();
+    o.labels = buildUnnamed637();
     o.operationType = "foo";
     o.startTime = "foo";
     o.state = "foo";
@@ -412,11 +409,12 @@
   return o;
 }
 
-checkGoogleDatastoreAdminV1beta1CommonMetadata(api.GoogleDatastoreAdminV1beta1CommonMetadata o) {
+checkGoogleDatastoreAdminV1beta1CommonMetadata(
+    api.GoogleDatastoreAdminV1beta1CommonMetadata o) {
   buildCounterGoogleDatastoreAdminV1beta1CommonMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1CommonMetadata < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed638(o.labels);
+    checkUnnamed637(o.labels);
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -424,6 +422,19 @@
   buildCounterGoogleDatastoreAdminV1beta1CommonMetadata--;
 }
 
+buildUnnamed638() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed638(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed639() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -437,36 +448,24 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed640() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed640(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterGoogleDatastoreAdminV1beta1EntityFilter = 0;
 buildGoogleDatastoreAdminV1beta1EntityFilter() {
   var o = new api.GoogleDatastoreAdminV1beta1EntityFilter();
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter++;
   if (buildCounterGoogleDatastoreAdminV1beta1EntityFilter < 3) {
-    o.kinds = buildUnnamed639();
-    o.namespaceIds = buildUnnamed640();
+    o.kinds = buildUnnamed638();
+    o.namespaceIds = buildUnnamed639();
   }
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter--;
   return o;
 }
 
-checkGoogleDatastoreAdminV1beta1EntityFilter(api.GoogleDatastoreAdminV1beta1EntityFilter o) {
+checkGoogleDatastoreAdminV1beta1EntityFilter(
+    api.GoogleDatastoreAdminV1beta1EntityFilter o) {
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter++;
   if (buildCounterGoogleDatastoreAdminV1beta1EntityFilter < 3) {
-    checkUnnamed639(o.kinds);
-    checkUnnamed640(o.namespaceIds);
+    checkUnnamed638(o.kinds);
+    checkUnnamed639(o.namespaceIds);
   }
   buildCounterGoogleDatastoreAdminV1beta1EntityFilter--;
 }
@@ -486,7 +485,8 @@
   return o;
 }
 
-checkGoogleDatastoreAdminV1beta1ExportEntitiesMetadata(api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata o) {
+checkGoogleDatastoreAdminV1beta1ExportEntitiesMetadata(
+    api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata o) {
   buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesMetadata < 3) {
     checkGoogleDatastoreAdminV1beta1CommonMetadata(o.common);
@@ -509,7 +509,8 @@
   return o;
 }
 
-checkGoogleDatastoreAdminV1beta1ExportEntitiesResponse(api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse o) {
+checkGoogleDatastoreAdminV1beta1ExportEntitiesResponse(
+    api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse o) {
   buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesResponse++;
   if (buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesResponse < 3) {
     unittest.expect(o.outputUrl, unittest.equals('foo'));
@@ -532,7 +533,8 @@
   return o;
 }
 
-checkGoogleDatastoreAdminV1beta1ImportEntitiesMetadata(api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata o) {
+checkGoogleDatastoreAdminV1beta1ImportEntitiesMetadata(
+    api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata o) {
   buildCounterGoogleDatastoreAdminV1beta1ImportEntitiesMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1ImportEntitiesMetadata < 3) {
     checkGoogleDatastoreAdminV1beta1CommonMetadata(o.common);
@@ -556,7 +558,8 @@
   return o;
 }
 
-checkGoogleDatastoreAdminV1beta1Progress(api.GoogleDatastoreAdminV1beta1Progress o) {
+checkGoogleDatastoreAdminV1beta1Progress(
+    api.GoogleDatastoreAdminV1beta1Progress o) {
   buildCounterGoogleDatastoreAdminV1beta1Progress++;
   if (buildCounterGoogleDatastoreAdminV1beta1Progress < 3) {
     unittest.expect(o.workCompleted, unittest.equals('foo'));
@@ -565,14 +568,14 @@
   buildCounterGoogleDatastoreAdminV1beta1Progress--;
 }
 
-buildUnnamed641() {
+buildUnnamed640() {
   var o = new core.List<api.GoogleLongrunningOperation>();
   o.add(buildGoogleLongrunningOperation());
   o.add(buildGoogleLongrunningOperation());
   return o;
 }
 
-checkUnnamed641(core.List<api.GoogleLongrunningOperation> o) {
+checkUnnamed640(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleLongrunningOperation(o[0]);
   checkGoogleLongrunningOperation(o[1]);
@@ -584,45 +587,78 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed641();
+    o.operations = buildUnnamed640();
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
   return o;
 }
 
-checkGoogleLongrunningListOperationsResponse(api.GoogleLongrunningListOperationsResponse o) {
+checkGoogleLongrunningListOperationsResponse(
+    api.GoogleLongrunningListOperationsResponse o) {
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed641(o.operations);
+    checkUnnamed640(o.operations);
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
 }
 
+buildUnnamed641() {
+  var o = new core.Map<core.String, core.Object>();
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  return o;
+}
+
+checkUnnamed641(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
+}
+
 buildUnnamed642() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
 checkUnnamed642(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
-}
-
-buildUnnamed643() {
-  var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  return o;
-}
-
-checkUnnamed643(core.Map<core.String, core.Object> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterGoogleLongrunningOperation = 0;
@@ -632,9 +668,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed642();
+    o.metadata = buildUnnamed641();
     o.name = "foo";
-    o.response = buildUnnamed643();
+    o.response = buildUnnamed642();
   }
   buildCounterGoogleLongrunningOperation--;
   return o;
@@ -645,34 +681,34 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed642(o.metadata);
+    checkUnnamed641(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed643(o.response);
+    checkUnnamed642(o.response);
   }
   buildCounterGoogleLongrunningOperation--;
 }
 
-buildUnnamed644() {
+buildUnnamed643() {
   var o = new core.Map<core.String, api.GqlQueryParameter>();
   o["x"] = buildGqlQueryParameter();
   o["y"] = buildGqlQueryParameter();
   return o;
 }
 
-checkUnnamed644(core.Map<core.String, api.GqlQueryParameter> o) {
+checkUnnamed643(core.Map<core.String, api.GqlQueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryParameter(o["x"]);
   checkGqlQueryParameter(o["y"]);
 }
 
-buildUnnamed645() {
+buildUnnamed644() {
   var o = new core.List<api.GqlQueryParameter>();
   o.add(buildGqlQueryParameter());
   o.add(buildGqlQueryParameter());
   return o;
 }
 
-checkUnnamed645(core.List<api.GqlQueryParameter> o) {
+checkUnnamed644(core.List<api.GqlQueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryParameter(o[0]);
   checkGqlQueryParameter(o[1]);
@@ -684,8 +720,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     o.allowLiterals = true;
-    o.namedBindings = buildUnnamed644();
-    o.positionalBindings = buildUnnamed645();
+    o.namedBindings = buildUnnamed643();
+    o.positionalBindings = buildUnnamed644();
     o.queryString = "foo";
   }
   buildCounterGqlQuery--;
@@ -696,8 +732,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     unittest.expect(o.allowLiterals, unittest.isTrue);
-    checkUnnamed644(o.namedBindings);
-    checkUnnamed645(o.positionalBindings);
+    checkUnnamed643(o.namedBindings);
+    checkUnnamed644(o.positionalBindings);
     unittest.expect(o.queryString, unittest.equals('foo'));
   }
   buildCounterGqlQuery--;
@@ -724,14 +760,14 @@
   buildCounterGqlQueryParameter--;
 }
 
-buildUnnamed646() {
+buildUnnamed645() {
   var o = new core.List<api.PathElement>();
   o.add(buildPathElement());
   o.add(buildPathElement());
   return o;
 }
 
-checkUnnamed646(core.List<api.PathElement> o) {
+checkUnnamed645(core.List<api.PathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathElement(o[0]);
   checkPathElement(o[1]);
@@ -743,7 +779,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     o.partitionId = buildPartitionId();
-    o.path = buildUnnamed646();
+    o.path = buildUnnamed645();
   }
   buildCounterKey--;
   return o;
@@ -753,7 +789,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     checkPartitionId(o.partitionId);
-    checkUnnamed646(o.path);
+    checkUnnamed645(o.path);
   }
   buildCounterKey--;
 }
@@ -798,6 +834,40 @@
   buildCounterLatLng--;
 }
 
+buildUnnamed646() {
+  var o = new core.List<api.Key>();
+  o.add(buildKey());
+  o.add(buildKey());
+  return o;
+}
+
+checkUnnamed646(core.List<api.Key> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkKey(o[0]);
+  checkKey(o[1]);
+}
+
+core.int buildCounterLookupRequest = 0;
+buildLookupRequest() {
+  var o = new api.LookupRequest();
+  buildCounterLookupRequest++;
+  if (buildCounterLookupRequest < 3) {
+    o.keys = buildUnnamed646();
+    o.readOptions = buildReadOptions();
+  }
+  buildCounterLookupRequest--;
+  return o;
+}
+
+checkLookupRequest(api.LookupRequest o) {
+  buildCounterLookupRequest++;
+  if (buildCounterLookupRequest < 3) {
+    checkUnnamed646(o.keys);
+    checkReadOptions(o.readOptions);
+  }
+  buildCounterLookupRequest--;
+}
+
 buildUnnamed647() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
@@ -811,38 +881,17 @@
   checkKey(o[1]);
 }
 
-core.int buildCounterLookupRequest = 0;
-buildLookupRequest() {
-  var o = new api.LookupRequest();
-  buildCounterLookupRequest++;
-  if (buildCounterLookupRequest < 3) {
-    o.keys = buildUnnamed647();
-    o.readOptions = buildReadOptions();
-  }
-  buildCounterLookupRequest--;
-  return o;
-}
-
-checkLookupRequest(api.LookupRequest o) {
-  buildCounterLookupRequest++;
-  if (buildCounterLookupRequest < 3) {
-    checkUnnamed647(o.keys);
-    checkReadOptions(o.readOptions);
-  }
-  buildCounterLookupRequest--;
-}
-
 buildUnnamed648() {
-  var o = new core.List<api.Key>();
-  o.add(buildKey());
-  o.add(buildKey());
+  var o = new core.List<api.EntityResult>();
+  o.add(buildEntityResult());
+  o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed648(core.List<api.Key> o) {
+checkUnnamed648(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
+  checkEntityResult(o[0]);
+  checkEntityResult(o[1]);
 }
 
 buildUnnamed649() {
@@ -858,27 +907,14 @@
   checkEntityResult(o[1]);
 }
 
-buildUnnamed650() {
-  var o = new core.List<api.EntityResult>();
-  o.add(buildEntityResult());
-  o.add(buildEntityResult());
-  return o;
-}
-
-checkUnnamed650(core.List<api.EntityResult> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkEntityResult(o[0]);
-  checkEntityResult(o[1]);
-}
-
 core.int buildCounterLookupResponse = 0;
 buildLookupResponse() {
   var o = new api.LookupResponse();
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    o.deferred = buildUnnamed648();
-    o.found = buildUnnamed649();
-    o.missing = buildUnnamed650();
+    o.deferred = buildUnnamed647();
+    o.found = buildUnnamed648();
+    o.missing = buildUnnamed649();
   }
   buildCounterLookupResponse--;
   return o;
@@ -887,9 +923,9 @@
 checkLookupResponse(api.LookupResponse o) {
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    checkUnnamed648(o.deferred);
-    checkUnnamed649(o.found);
-    checkUnnamed650(o.missing);
+    checkUnnamed647(o.deferred);
+    checkUnnamed648(o.found);
+    checkUnnamed649(o.missing);
   }
   buildCounterLookupResponse--;
 }
@@ -1070,53 +1106,53 @@
   buildCounterPropertyReference--;
 }
 
-buildUnnamed651() {
+buildUnnamed650() {
   var o = new core.List<api.PropertyReference>();
   o.add(buildPropertyReference());
   o.add(buildPropertyReference());
   return o;
 }
 
-checkUnnamed651(core.List<api.PropertyReference> o) {
+checkUnnamed650(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyReference(o[0]);
   checkPropertyReference(o[1]);
 }
 
-buildUnnamed652() {
+buildUnnamed651() {
   var o = new core.List<api.KindExpression>();
   o.add(buildKindExpression());
   o.add(buildKindExpression());
   return o;
 }
 
-checkUnnamed652(core.List<api.KindExpression> o) {
+checkUnnamed651(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKindExpression(o[0]);
   checkKindExpression(o[1]);
 }
 
-buildUnnamed653() {
+buildUnnamed652() {
   var o = new core.List<api.PropertyOrder>();
   o.add(buildPropertyOrder());
   o.add(buildPropertyOrder());
   return o;
 }
 
-checkUnnamed653(core.List<api.PropertyOrder> o) {
+checkUnnamed652(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyOrder(o[0]);
   checkPropertyOrder(o[1]);
 }
 
-buildUnnamed654() {
+buildUnnamed653() {
   var o = new core.List<api.Projection>();
   o.add(buildProjection());
   o.add(buildProjection());
   return o;
 }
 
-checkUnnamed654(core.List<api.Projection> o) {
+checkUnnamed653(core.List<api.Projection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjection(o[0]);
   checkProjection(o[1]);
@@ -1127,14 +1163,14 @@
   var o = new api.Query();
   buildCounterQuery++;
   if (buildCounterQuery < 3) {
-    o.distinctOn = buildUnnamed651();
+    o.distinctOn = buildUnnamed650();
     o.endCursor = "foo";
     o.filter = buildFilter();
-    o.kind = buildUnnamed652();
+    o.kind = buildUnnamed651();
     o.limit = 42;
     o.offset = 42;
-    o.order = buildUnnamed653();
-    o.projection = buildUnnamed654();
+    o.order = buildUnnamed652();
+    o.projection = buildUnnamed653();
     o.startCursor = "foo";
   }
   buildCounterQuery--;
@@ -1144,27 +1180,27 @@
 checkQuery(api.Query o) {
   buildCounterQuery++;
   if (buildCounterQuery < 3) {
-    checkUnnamed651(o.distinctOn);
+    checkUnnamed650(o.distinctOn);
     unittest.expect(o.endCursor, unittest.equals('foo'));
     checkFilter(o.filter);
-    checkUnnamed652(o.kind);
+    checkUnnamed651(o.kind);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
-    checkUnnamed653(o.order);
-    checkUnnamed654(o.projection);
+    checkUnnamed652(o.order);
+    checkUnnamed653(o.projection);
     unittest.expect(o.startCursor, unittest.equals('foo'));
   }
   buildCounterQuery--;
 }
 
-buildUnnamed655() {
+buildUnnamed654() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed655(core.List<api.EntityResult> o) {
+checkUnnamed654(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -1177,7 +1213,7 @@
   if (buildCounterQueryResultBatch < 3) {
     o.endCursor = "foo";
     o.entityResultType = "foo";
-    o.entityResults = buildUnnamed655();
+    o.entityResults = buildUnnamed654();
     o.moreResults = "foo";
     o.skippedCursor = "foo";
     o.skippedResults = 42;
@@ -1192,7 +1228,7 @@
   if (buildCounterQueryResultBatch < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     unittest.expect(o.entityResultType, unittest.equals('foo'));
-    checkUnnamed655(o.entityResults);
+    checkUnnamed654(o.entityResults);
     unittest.expect(o.moreResults, unittest.equals('foo'));
     unittest.expect(o.skippedCursor, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
@@ -1205,16 +1241,14 @@
 buildReadOnly() {
   var o = new api.ReadOnly();
   buildCounterReadOnly++;
-  if (buildCounterReadOnly < 3) {
-  }
+  if (buildCounterReadOnly < 3) {}
   buildCounterReadOnly--;
   return o;
 }
 
 checkReadOnly(api.ReadOnly o) {
   buildCounterReadOnly++;
-  if (buildCounterReadOnly < 3) {
-  }
+  if (buildCounterReadOnly < 3) {}
   buildCounterReadOnly--;
 }
 
@@ -1281,16 +1315,14 @@
 buildRollbackResponse() {
   var o = new api.RollbackResponse();
   buildCounterRollbackResponse++;
-  if (buildCounterRollbackResponse < 3) {
-  }
+  if (buildCounterRollbackResponse < 3) {}
   buildCounterRollbackResponse--;
   return o;
 }
 
 checkRollbackResponse(api.RollbackResponse o) {
   buildCounterRollbackResponse++;
-  if (buildCounterRollbackResponse < 3) {
-  }
+  if (buildCounterRollbackResponse < 3) {}
   buildCounterRollbackResponse--;
 }
 
@@ -1340,30 +1372,46 @@
   buildCounterRunQueryResponse--;
 }
 
-buildUnnamed656() {
+buildUnnamed655() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed656(core.Map<core.String, core.Object> o) {
+checkUnnamed655(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed657() {
+buildUnnamed656() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed656());
-  o.add(buildUnnamed656());
+  o.add(buildUnnamed655());
+  o.add(buildUnnamed655());
   return o;
 }
 
-checkUnnamed657(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed656(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed656(o[0]);
-  checkUnnamed656(o[1]);
+  checkUnnamed655(o[0]);
+  checkUnnamed655(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1372,7 +1420,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed657();
+    o.details = buildUnnamed656();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1383,7 +1431,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed657(o.details);
+    checkUnnamed656(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1453,7 +1501,6 @@
   buildCounterValue--;
 }
 
-
 main() {
   unittest.group("obj-schema-AllocateIdsRequest", () {
     unittest.test("to-json--from-json", () {
@@ -1463,7 +1510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AllocateIdsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAllocateIdsResponse();
@@ -1472,7 +1518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ArrayValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildArrayValue();
@@ -1481,7 +1526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BeginTransactionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBeginTransactionRequest();
@@ -1490,7 +1534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BeginTransactionResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildBeginTransactionResponse();
@@ -1499,7 +1542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitRequest();
@@ -1508,7 +1550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitResponse();
@@ -1517,7 +1558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CompositeFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildCompositeFilter();
@@ -1526,7 +1566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -1535,7 +1574,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Entity", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntity();
@@ -1544,7 +1582,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityResult();
@@ -1553,7 +1590,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Filter", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilter();
@@ -1562,52 +1598,57 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleDatastoreAdminV1beta1CommonMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleDatastoreAdminV1beta1CommonMetadata();
-      var od = new api.GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(o.toJson());
+      var od = new api.GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(
+          o.toJson());
       checkGoogleDatastoreAdminV1beta1CommonMetadata(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleDatastoreAdminV1beta1EntityFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleDatastoreAdminV1beta1EntityFilter();
-      var od = new api.GoogleDatastoreAdminV1beta1EntityFilter.fromJson(o.toJson());
+      var od =
+          new api.GoogleDatastoreAdminV1beta1EntityFilter.fromJson(o.toJson());
       checkGoogleDatastoreAdminV1beta1EntityFilter(od);
     });
   });
 
-
-  unittest.group("obj-schema-GoogleDatastoreAdminV1beta1ExportEntitiesMetadata", () {
+  unittest.group("obj-schema-GoogleDatastoreAdminV1beta1ExportEntitiesMetadata",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleDatastoreAdminV1beta1ExportEntitiesMetadata();
-      var od = new api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata.fromJson(o.toJson());
+      var od =
+          new api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata.fromJson(
+              o.toJson());
       checkGoogleDatastoreAdminV1beta1ExportEntitiesMetadata(od);
     });
   });
 
-
-  unittest.group("obj-schema-GoogleDatastoreAdminV1beta1ExportEntitiesResponse", () {
+  unittest.group("obj-schema-GoogleDatastoreAdminV1beta1ExportEntitiesResponse",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleDatastoreAdminV1beta1ExportEntitiesResponse();
-      var od = new api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse.fromJson(o.toJson());
+      var od =
+          new api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse.fromJson(
+              o.toJson());
       checkGoogleDatastoreAdminV1beta1ExportEntitiesResponse(od);
     });
   });
 
-
-  unittest.group("obj-schema-GoogleDatastoreAdminV1beta1ImportEntitiesMetadata", () {
+  unittest.group("obj-schema-GoogleDatastoreAdminV1beta1ImportEntitiesMetadata",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleDatastoreAdminV1beta1ImportEntitiesMetadata();
-      var od = new api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata.fromJson(o.toJson());
+      var od =
+          new api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata.fromJson(
+              o.toJson());
       checkGoogleDatastoreAdminV1beta1ImportEntitiesMetadata(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleDatastoreAdminV1beta1Progress", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleDatastoreAdminV1beta1Progress();
@@ -1616,16 +1657,15 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleLongrunningListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = new api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var od =
+          new api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
       checkGoogleLongrunningListOperationsResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleLongrunningOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleLongrunningOperation();
@@ -1634,7 +1674,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GqlQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildGqlQuery();
@@ -1643,7 +1682,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GqlQueryParameter", () {
     unittest.test("to-json--from-json", () {
       var o = buildGqlQueryParameter();
@@ -1652,7 +1690,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Key", () {
     unittest.test("to-json--from-json", () {
       var o = buildKey();
@@ -1661,7 +1698,6 @@
     });
   });
 
-
   unittest.group("obj-schema-KindExpression", () {
     unittest.test("to-json--from-json", () {
       var o = buildKindExpression();
@@ -1670,7 +1706,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LatLng", () {
     unittest.test("to-json--from-json", () {
       var o = buildLatLng();
@@ -1679,7 +1714,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LookupRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildLookupRequest();
@@ -1688,7 +1722,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LookupResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLookupResponse();
@@ -1697,7 +1730,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Mutation", () {
     unittest.test("to-json--from-json", () {
       var o = buildMutation();
@@ -1706,7 +1738,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MutationResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildMutationResult();
@@ -1715,7 +1746,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PartitionId", () {
     unittest.test("to-json--from-json", () {
       var o = buildPartitionId();
@@ -1724,7 +1754,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PathElement", () {
     unittest.test("to-json--from-json", () {
       var o = buildPathElement();
@@ -1733,7 +1762,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Projection", () {
     unittest.test("to-json--from-json", () {
       var o = buildProjection();
@@ -1742,7 +1770,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PropertyFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildPropertyFilter();
@@ -1751,7 +1778,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PropertyOrder", () {
     unittest.test("to-json--from-json", () {
       var o = buildPropertyOrder();
@@ -1760,7 +1786,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PropertyReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildPropertyReference();
@@ -1769,7 +1794,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Query", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuery();
@@ -1778,7 +1802,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QueryResultBatch", () {
     unittest.test("to-json--from-json", () {
       var o = buildQueryResultBatch();
@@ -1787,7 +1810,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadOnly", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadOnly();
@@ -1796,7 +1818,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadOptions();
@@ -1805,7 +1826,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadWrite", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadWrite();
@@ -1814,7 +1834,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RollbackRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRollbackRequest();
@@ -1823,7 +1842,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RollbackResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRollbackResponse();
@@ -1832,7 +1850,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RunQueryRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRunQueryRequest();
@@ -1841,7 +1858,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RunQueryResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRunQueryResponse();
@@ -1850,7 +1866,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1859,7 +1874,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransactionOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransactionOptions();
@@ -1868,7 +1882,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Value", () {
     unittest.test("to-json--from-json", () {
       var o = buildValue();
@@ -1877,10 +1890,8 @@
     });
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--allocateIds", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DatastoreApi(mock).projects;
       var arg_request = buildAllocateIdsRequest();
@@ -1893,16 +1904,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":allocateIds", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals(":allocateIds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals(":allocateIds"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1915,27 +1930,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAllocateIdsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.allocateIds(arg_request, arg_projectId).then(unittest.expectAsync1(((api.AllocateIdsResponse response) {
+      res
+          .allocateIds(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.AllocateIdsResponse response) {
         checkAllocateIdsResponse(response);
       })));
     });
 
     unittest.test("method--beginTransaction", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DatastoreApi(mock).projects;
       var arg_request = buildBeginTransactionRequest();
@@ -1948,16 +1965,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":beginTransaction", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals(":beginTransaction"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals(":beginTransaction"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -1970,27 +1991,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBeginTransactionResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.beginTransaction(arg_request, arg_projectId).then(unittest.expectAsync1(((api.BeginTransactionResponse response) {
+      res
+          .beginTransaction(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.BeginTransactionResponse response) {
         checkBeginTransactionResponse(response);
       })));
     });
 
     unittest.test("method--commit", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DatastoreApi(mock).projects;
       var arg_request = buildCommitRequest();
@@ -2003,16 +2026,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":commit", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":commit"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":commit"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2025,27 +2052,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommitResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.commit(arg_request, arg_projectId).then(unittest.expectAsync1(((api.CommitResponse response) {
+      res
+          .commit(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.CommitResponse response) {
         checkCommitResponse(response);
       })));
     });
 
     unittest.test("method--lookup", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DatastoreApi(mock).projects;
       var arg_request = buildLookupRequest();
@@ -2058,16 +2087,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":lookup", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":lookup"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":lookup"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2080,27 +2113,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLookupResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.lookup(arg_request, arg_projectId).then(unittest.expectAsync1(((api.LookupResponse response) {
+      res
+          .lookup(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.LookupResponse response) {
         checkLookupResponse(response);
       })));
     });
 
     unittest.test("method--rollback", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DatastoreApi(mock).projects;
       var arg_request = buildRollbackRequest();
@@ -2113,16 +2148,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":rollback", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":rollback"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":rollback"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2135,27 +2174,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRollbackResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.rollback(arg_request, arg_projectId).then(unittest.expectAsync1(((api.RollbackResponse response) {
+      res
+          .rollback(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.RollbackResponse response) {
         checkRollbackResponse(response);
       })));
     });
 
     unittest.test("method--runQuery", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DatastoreApi(mock).projects;
       var arg_request = buildRunQueryRequest();
@@ -2168,16 +2209,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/projects/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/projects/"));
         pathOffset += 12;
         index = path.indexOf(":runQuery", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":runQuery"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":runQuery"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2190,42 +2235,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRunQueryResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.runQuery(arg_request, arg_projectId).then(unittest.expectAsync1(((api.RunQueryResponse response) {
+      res
+          .runQuery(arg_request, arg_projectId)
+          .then(unittest.expectAsync1(((api.RunQueryResponse response) {
         checkRunQueryResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.DatastoreApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.DatastoreApi(mock).projects.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2239,16 +2287,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2259,18 +2308,20 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.DatastoreApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.DatastoreApi(mock).projects.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2284,16 +2335,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2304,18 +2356,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.DatastoreApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.DatastoreApi(mock).projects.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2329,29 +2383,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleLongrunningOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
+      res.get(arg_name).then(
+          unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
         checkGoogleLongrunningOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.DatastoreApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.DatastoreApi(mock).projects.operations;
       var arg_name = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
@@ -2361,9 +2417,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2377,30 +2435,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildGoogleLongrunningListOperationsResponse());
+        var resp =
+            convert.JSON.encode(buildGoogleLongrunningListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.GoogleLongrunningListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageSize: arg_pageSize,
+              filter: arg_filter,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(
+              ((api.GoogleLongrunningListOperationsResponse response) {
         checkGoogleLongrunningListOperationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/deploymentmanager/v2_test.dart b/generated/googleapis/test/deploymentmanager/v2_test.dart
index 6ce6605..ab0d5d5 100644
--- a/generated/googleapis/test/deploymentmanager/v2_test.dart
+++ b/generated/googleapis/test/deploymentmanager/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.deploymentmanager.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/deploymentmanager/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,33 +44,33 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2194() {
+buildUnnamed2181() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed2194(core.List<api.AuditLogConfig> o) {
+checkUnnamed2181(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed2195() {
+buildUnnamed2182() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2195(core.List<core.String> o) {
+checkUnnamed2182(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -82,8 +81,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed2194();
-    o.exemptedMembers = buildUnnamed2195();
+    o.auditLogConfigs = buildUnnamed2181();
+    o.exemptedMembers = buildUnnamed2182();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -93,21 +92,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed2194(o.auditLogConfigs);
-    checkUnnamed2195(o.exemptedMembers);
+    checkUnnamed2181(o.auditLogConfigs);
+    checkUnnamed2182(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed2196() {
+buildUnnamed2183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2196(core.List<core.String> o) {
+checkUnnamed2183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -118,7 +117,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed2196();
+    o.exemptedMembers = buildUnnamed2183();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -128,7 +127,7 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed2196(o.exemptedMembers);
+    checkUnnamed2183(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
@@ -153,14 +152,14 @@
   buildCounterAuthorizationLoggingOptions--;
 }
 
-buildUnnamed2197() {
+buildUnnamed2184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2197(core.List<core.String> o) {
+checkUnnamed2184(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -172,7 +171,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed2197();
+    o.members = buildUnnamed2184();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -183,20 +182,20 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed2197(o.members);
+    checkUnnamed2184(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed2198() {
+buildUnnamed2185() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2198(core.List<core.String> o) {
+checkUnnamed2185(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -212,7 +211,7 @@
     o.svc = "foo";
     o.sys = "foo";
     o.value = "foo";
-    o.values = buildUnnamed2198();
+    o.values = buildUnnamed2185();
   }
   buildCounterCondition--;
   return o;
@@ -226,7 +225,7 @@
     unittest.expect(o.svc, unittest.equals('foo'));
     unittest.expect(o.sys, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed2198(o.values);
+    checkUnnamed2185(o.values);
   }
   buildCounterCondition--;
 }
@@ -250,14 +249,14 @@
   buildCounterConfigFile--;
 }
 
-buildUnnamed2199() {
+buildUnnamed2186() {
   var o = new core.List<api.DeploymentLabelEntry>();
   o.add(buildDeploymentLabelEntry());
   o.add(buildDeploymentLabelEntry());
   return o;
 }
 
-checkUnnamed2199(core.List<api.DeploymentLabelEntry> o) {
+checkUnnamed2186(core.List<api.DeploymentLabelEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeploymentLabelEntry(o[0]);
   checkDeploymentLabelEntry(o[1]);
@@ -272,7 +271,7 @@
     o.fingerprint = "foo";
     o.id = "foo";
     o.insertTime = "foo";
-    o.labels = buildUnnamed2199();
+    o.labels = buildUnnamed2186();
     o.manifest = "foo";
     o.name = "foo";
     o.operation = buildOperation();
@@ -291,7 +290,7 @@
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
-    checkUnnamed2199(o.labels);
+    checkUnnamed2186(o.labels);
     unittest.expect(o.manifest, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkOperation(o.operation);
@@ -323,14 +322,14 @@
   buildCounterDeploymentLabelEntry--;
 }
 
-buildUnnamed2200() {
+buildUnnamed2187() {
   var o = new core.List<api.DeploymentUpdateLabelEntry>();
   o.add(buildDeploymentUpdateLabelEntry());
   o.add(buildDeploymentUpdateLabelEntry());
   return o;
 }
 
-checkUnnamed2200(core.List<api.DeploymentUpdateLabelEntry> o) {
+checkUnnamed2187(core.List<api.DeploymentUpdateLabelEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeploymentUpdateLabelEntry(o[0]);
   checkDeploymentUpdateLabelEntry(o[1]);
@@ -342,7 +341,7 @@
   buildCounterDeploymentUpdate++;
   if (buildCounterDeploymentUpdate < 3) {
     o.description = "foo";
-    o.labels = buildUnnamed2200();
+    o.labels = buildUnnamed2187();
     o.manifest = "foo";
   }
   buildCounterDeploymentUpdate--;
@@ -353,7 +352,7 @@
   buildCounterDeploymentUpdate++;
   if (buildCounterDeploymentUpdate < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2200(o.labels);
+    checkUnnamed2187(o.labels);
     unittest.expect(o.manifest, unittest.equals('foo'));
   }
   buildCounterDeploymentUpdate--;
@@ -399,14 +398,14 @@
   buildCounterDeploymentsCancelPreviewRequest--;
 }
 
-buildUnnamed2201() {
+buildUnnamed2188() {
   var o = new core.List<api.Deployment>();
   o.add(buildDeployment());
   o.add(buildDeployment());
   return o;
 }
 
-checkUnnamed2201(core.List<api.Deployment> o) {
+checkUnnamed2188(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeployment(o[0]);
   checkDeployment(o[1]);
@@ -417,7 +416,7 @@
   var o = new api.DeploymentsListResponse();
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
-    o.deployments = buildUnnamed2201();
+    o.deployments = buildUnnamed2188();
     o.nextPageToken = "foo";
   }
   buildCounterDeploymentsListResponse--;
@@ -427,7 +426,7 @@
 checkDeploymentsListResponse(api.DeploymentsListResponse o) {
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
-    checkUnnamed2201(o.deployments);
+    checkUnnamed2188(o.deployments);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDeploymentsListResponse--;
@@ -582,14 +581,14 @@
   buildCounterLogConfigDataAccessOptions--;
 }
 
-buildUnnamed2202() {
+buildUnnamed2189() {
   var o = new core.List<api.ImportFile>();
   o.add(buildImportFile());
   o.add(buildImportFile());
   return o;
 }
 
-checkUnnamed2202(core.List<api.ImportFile> o) {
+checkUnnamed2189(core.List<api.ImportFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImportFile(o[0]);
   checkImportFile(o[1]);
@@ -603,7 +602,7 @@
     o.config = buildConfigFile();
     o.expandedConfig = "foo";
     o.id = "foo";
-    o.imports = buildUnnamed2202();
+    o.imports = buildUnnamed2189();
     o.insertTime = "foo";
     o.layout = "foo";
     o.name = "foo";
@@ -619,7 +618,7 @@
     checkConfigFile(o.config);
     unittest.expect(o.expandedConfig, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2202(o.imports);
+    checkUnnamed2189(o.imports);
     unittest.expect(o.insertTime, unittest.equals('foo'));
     unittest.expect(o.layout, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -628,14 +627,14 @@
   buildCounterManifest--;
 }
 
-buildUnnamed2203() {
+buildUnnamed2190() {
   var o = new core.List<api.Manifest>();
   o.add(buildManifest());
   o.add(buildManifest());
   return o;
 }
 
-checkUnnamed2203(core.List<api.Manifest> o) {
+checkUnnamed2190(core.List<api.Manifest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManifest(o[0]);
   checkManifest(o[1]);
@@ -646,7 +645,7 @@
   var o = new api.ManifestsListResponse();
   buildCounterManifestsListResponse++;
   if (buildCounterManifestsListResponse < 3) {
-    o.manifests = buildUnnamed2203();
+    o.manifests = buildUnnamed2190();
     o.nextPageToken = "foo";
   }
   buildCounterManifestsListResponse--;
@@ -656,7 +655,7 @@
 checkManifestsListResponse(api.ManifestsListResponse o) {
   buildCounterManifestsListResponse++;
   if (buildCounterManifestsListResponse < 3) {
-    checkUnnamed2203(o.manifests);
+    checkUnnamed2190(o.manifests);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManifestsListResponse--;
@@ -685,14 +684,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed2204() {
+buildUnnamed2191() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed2204(core.List<api.OperationErrorErrors> o) {
+checkUnnamed2191(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -703,7 +702,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed2204();
+    o.errors = buildUnnamed2191();
   }
   buildCounterOperationError--;
   return o;
@@ -712,7 +711,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed2204(o.errors);
+    checkUnnamed2191(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -738,14 +737,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed2205() {
+buildUnnamed2192() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed2205(core.List<api.OperationWarningsData> o) {
+checkUnnamed2192(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -757,7 +756,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2205();
+    o.data = buildUnnamed2192();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -768,20 +767,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2205(o.data);
+    checkUnnamed2192(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed2206() {
+buildUnnamed2193() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed2206(core.List<api.OperationWarnings> o) {
+checkUnnamed2193(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -813,7 +812,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed2206();
+    o.warnings = buildUnnamed2193();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -844,20 +843,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed2206(o.warnings);
+    checkUnnamed2193(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2207() {
+buildUnnamed2194() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2207(core.List<api.Operation> o) {
+checkUnnamed2194(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -869,7 +868,7 @@
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2207();
+    o.operations = buildUnnamed2194();
   }
   buildCounterOperationsListResponse--;
   return o;
@@ -879,45 +878,45 @@
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2207(o.operations);
+    checkUnnamed2194(o.operations);
   }
   buildCounterOperationsListResponse--;
 }
 
-buildUnnamed2208() {
+buildUnnamed2195() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed2208(core.List<api.AuditConfig> o) {
+checkUnnamed2195(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed2209() {
+buildUnnamed2196() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed2209(core.List<api.Binding> o) {
+checkUnnamed2196(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
 }
 
-buildUnnamed2210() {
+buildUnnamed2197() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed2210(core.List<api.Rule> o) {
+checkUnnamed2197(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
@@ -928,11 +927,11 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed2208();
-    o.bindings = buildUnnamed2209();
+    o.auditConfigs = buildUnnamed2195();
+    o.bindings = buildUnnamed2196();
     o.etag = "foo";
     o.iamOwned = true;
-    o.rules = buildUnnamed2210();
+    o.rules = buildUnnamed2197();
     o.version = 42;
   }
   buildCounterPolicy--;
@@ -942,11 +941,11 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed2208(o.auditConfigs);
-    checkUnnamed2209(o.bindings);
+    checkUnnamed2195(o.auditConfigs);
+    checkUnnamed2196(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed2210(o.rules);
+    checkUnnamed2197(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
@@ -973,14 +972,14 @@
   buildCounterResourceWarningsData--;
 }
 
-buildUnnamed2211() {
+buildUnnamed2198() {
   var o = new core.List<api.ResourceWarningsData>();
   o.add(buildResourceWarningsData());
   o.add(buildResourceWarningsData());
   return o;
 }
 
-checkUnnamed2211(core.List<api.ResourceWarningsData> o) {
+checkUnnamed2198(core.List<api.ResourceWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceWarningsData(o[0]);
   checkResourceWarningsData(o[1]);
@@ -992,7 +991,7 @@
   buildCounterResourceWarnings++;
   if (buildCounterResourceWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2211();
+    o.data = buildUnnamed2198();
     o.message = "foo";
   }
   buildCounterResourceWarnings--;
@@ -1003,20 +1002,20 @@
   buildCounterResourceWarnings++;
   if (buildCounterResourceWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2211(o.data);
+    checkUnnamed2198(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterResourceWarnings--;
 }
 
-buildUnnamed2212() {
+buildUnnamed2199() {
   var o = new core.List<api.ResourceWarnings>();
   o.add(buildResourceWarnings());
   o.add(buildResourceWarnings());
   return o;
 }
 
-checkUnnamed2212(core.List<api.ResourceWarnings> o) {
+checkUnnamed2199(core.List<api.ResourceWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceWarnings(o[0]);
   checkResourceWarnings(o[1]);
@@ -1038,7 +1037,7 @@
     o.update = buildResourceUpdate();
     o.updateTime = "foo";
     o.url = "foo";
-    o.warnings = buildUnnamed2212();
+    o.warnings = buildUnnamed2199();
   }
   buildCounterResource--;
   return o;
@@ -1058,7 +1057,7 @@
     checkResourceUpdate(o.update);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed2212(o.warnings);
+    checkUnnamed2199(o.warnings);
   }
   buildCounterResource--;
 }
@@ -1105,14 +1104,14 @@
   buildCounterResourceUpdateErrorErrors--;
 }
 
-buildUnnamed2213() {
+buildUnnamed2200() {
   var o = new core.List<api.ResourceUpdateErrorErrors>();
   o.add(buildResourceUpdateErrorErrors());
   o.add(buildResourceUpdateErrorErrors());
   return o;
 }
 
-checkUnnamed2213(core.List<api.ResourceUpdateErrorErrors> o) {
+checkUnnamed2200(core.List<api.ResourceUpdateErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceUpdateErrorErrors(o[0]);
   checkResourceUpdateErrorErrors(o[1]);
@@ -1123,7 +1122,7 @@
   var o = new api.ResourceUpdateError();
   buildCounterResourceUpdateError++;
   if (buildCounterResourceUpdateError < 3) {
-    o.errors = buildUnnamed2213();
+    o.errors = buildUnnamed2200();
   }
   buildCounterResourceUpdateError--;
   return o;
@@ -1132,7 +1131,7 @@
 checkResourceUpdateError(api.ResourceUpdateError o) {
   buildCounterResourceUpdateError++;
   if (buildCounterResourceUpdateError < 3) {
-    checkUnnamed2213(o.errors);
+    checkUnnamed2200(o.errors);
   }
   buildCounterResourceUpdateError--;
 }
@@ -1158,14 +1157,14 @@
   buildCounterResourceUpdateWarningsData--;
 }
 
-buildUnnamed2214() {
+buildUnnamed2201() {
   var o = new core.List<api.ResourceUpdateWarningsData>();
   o.add(buildResourceUpdateWarningsData());
   o.add(buildResourceUpdateWarningsData());
   return o;
 }
 
-checkUnnamed2214(core.List<api.ResourceUpdateWarningsData> o) {
+checkUnnamed2201(core.List<api.ResourceUpdateWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceUpdateWarningsData(o[0]);
   checkResourceUpdateWarningsData(o[1]);
@@ -1177,7 +1176,7 @@
   buildCounterResourceUpdateWarnings++;
   if (buildCounterResourceUpdateWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed2214();
+    o.data = buildUnnamed2201();
     o.message = "foo";
   }
   buildCounterResourceUpdateWarnings--;
@@ -1188,20 +1187,20 @@
   buildCounterResourceUpdateWarnings++;
   if (buildCounterResourceUpdateWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed2214(o.data);
+    checkUnnamed2201(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterResourceUpdateWarnings--;
 }
 
-buildUnnamed2215() {
+buildUnnamed2202() {
   var o = new core.List<api.ResourceUpdateWarnings>();
   o.add(buildResourceUpdateWarnings());
   o.add(buildResourceUpdateWarnings());
   return o;
 }
 
-checkUnnamed2215(core.List<api.ResourceUpdateWarnings> o) {
+checkUnnamed2202(core.List<api.ResourceUpdateWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceUpdateWarnings(o[0]);
   checkResourceUpdateWarnings(o[1]);
@@ -1219,7 +1218,7 @@
     o.manifest = "foo";
     o.properties = "foo";
     o.state = "foo";
-    o.warnings = buildUnnamed2215();
+    o.warnings = buildUnnamed2202();
   }
   buildCounterResourceUpdate--;
   return o;
@@ -1235,19 +1234,19 @@
     unittest.expect(o.manifest, unittest.equals('foo'));
     unittest.expect(o.properties, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkUnnamed2215(o.warnings);
+    checkUnnamed2202(o.warnings);
   }
   buildCounterResourceUpdate--;
 }
 
-buildUnnamed2216() {
+buildUnnamed2203() {
   var o = new core.List<api.Resource>();
   o.add(buildResource());
   o.add(buildResource());
   return o;
 }
 
-checkUnnamed2216(core.List<api.Resource> o) {
+checkUnnamed2203(core.List<api.Resource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResource(o[0]);
   checkResource(o[1]);
@@ -1259,7 +1258,7 @@
   buildCounterResourcesListResponse++;
   if (buildCounterResourcesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed2216();
+    o.resources = buildUnnamed2203();
   }
   buildCounterResourcesListResponse--;
   return o;
@@ -1269,71 +1268,71 @@
   buildCounterResourcesListResponse++;
   if (buildCounterResourcesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2216(o.resources);
+    checkUnnamed2203(o.resources);
   }
   buildCounterResourcesListResponse--;
 }
 
-buildUnnamed2217() {
+buildUnnamed2204() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed2217(core.List<api.Condition> o) {
+checkUnnamed2204(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed2218() {
+buildUnnamed2205() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2218(core.List<core.String> o) {
+checkUnnamed2205(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2219() {
+buildUnnamed2206() {
   var o = new core.List<api.LogConfig>();
   o.add(buildLogConfig());
   o.add(buildLogConfig());
   return o;
 }
 
-checkUnnamed2219(core.List<api.LogConfig> o) {
+checkUnnamed2206(core.List<api.LogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogConfig(o[0]);
   checkLogConfig(o[1]);
 }
 
-buildUnnamed2220() {
+buildUnnamed2207() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2220(core.List<core.String> o) {
+checkUnnamed2207(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2221() {
+buildUnnamed2208() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2221(core.List<core.String> o) {
+checkUnnamed2208(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1345,12 +1344,12 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     o.action = "foo";
-    o.conditions = buildUnnamed2217();
+    o.conditions = buildUnnamed2204();
     o.description = "foo";
-    o.ins = buildUnnamed2218();
-    o.logConfigs = buildUnnamed2219();
-    o.notIns = buildUnnamed2220();
-    o.permissions = buildUnnamed2221();
+    o.ins = buildUnnamed2205();
+    o.logConfigs = buildUnnamed2206();
+    o.notIns = buildUnnamed2207();
+    o.permissions = buildUnnamed2208();
   }
   buildCounterRule--;
   return o;
@@ -1360,24 +1359,24 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed2217(o.conditions);
+    checkUnnamed2204(o.conditions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2218(o.ins);
-    checkUnnamed2219(o.logConfigs);
-    checkUnnamed2220(o.notIns);
-    checkUnnamed2221(o.permissions);
+    checkUnnamed2205(o.ins);
+    checkUnnamed2206(o.logConfigs);
+    checkUnnamed2207(o.notIns);
+    checkUnnamed2208(o.permissions);
   }
   buildCounterRule--;
 }
 
-buildUnnamed2222() {
+buildUnnamed2209() {
   var o = new core.List<api.ImportFile>();
   o.add(buildImportFile());
   o.add(buildImportFile());
   return o;
 }
 
-checkUnnamed2222(core.List<api.ImportFile> o) {
+checkUnnamed2209(core.List<api.ImportFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImportFile(o[0]);
   checkImportFile(o[1]);
@@ -1389,7 +1388,7 @@
   buildCounterTargetConfiguration++;
   if (buildCounterTargetConfiguration < 3) {
     o.config = buildConfigFile();
-    o.imports = buildUnnamed2222();
+    o.imports = buildUnnamed2209();
   }
   buildCounterTargetConfiguration--;
   return o;
@@ -1399,19 +1398,19 @@
   buildCounterTargetConfiguration++;
   if (buildCounterTargetConfiguration < 3) {
     checkConfigFile(o.config);
-    checkUnnamed2222(o.imports);
+    checkUnnamed2209(o.imports);
   }
   buildCounterTargetConfiguration--;
 }
 
-buildUnnamed2223() {
+buildUnnamed2210() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2223(core.List<core.String> o) {
+checkUnnamed2210(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1422,7 +1421,7 @@
   var o = new api.TestPermissionsRequest();
   buildCounterTestPermissionsRequest++;
   if (buildCounterTestPermissionsRequest < 3) {
-    o.permissions = buildUnnamed2223();
+    o.permissions = buildUnnamed2210();
   }
   buildCounterTestPermissionsRequest--;
   return o;
@@ -1431,19 +1430,19 @@
 checkTestPermissionsRequest(api.TestPermissionsRequest o) {
   buildCounterTestPermissionsRequest++;
   if (buildCounterTestPermissionsRequest < 3) {
-    checkUnnamed2223(o.permissions);
+    checkUnnamed2210(o.permissions);
   }
   buildCounterTestPermissionsRequest--;
 }
 
-buildUnnamed2224() {
+buildUnnamed2211() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2224(core.List<core.String> o) {
+checkUnnamed2211(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1454,7 +1453,7 @@
   var o = new api.TestPermissionsResponse();
   buildCounterTestPermissionsResponse++;
   if (buildCounterTestPermissionsResponse < 3) {
-    o.permissions = buildUnnamed2224();
+    o.permissions = buildUnnamed2211();
   }
   buildCounterTestPermissionsResponse--;
   return o;
@@ -1463,7 +1462,7 @@
 checkTestPermissionsResponse(api.TestPermissionsResponse o) {
   buildCounterTestPermissionsResponse++;
   if (buildCounterTestPermissionsResponse < 3) {
-    checkUnnamed2224(o.permissions);
+    checkUnnamed2211(o.permissions);
   }
   buildCounterTestPermissionsResponse--;
 }
@@ -1495,14 +1494,14 @@
   buildCounterType--;
 }
 
-buildUnnamed2225() {
+buildUnnamed2212() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed2225(core.List<api.Type> o) {
+checkUnnamed2212(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -1514,7 +1513,7 @@
   buildCounterTypesListResponse++;
   if (buildCounterTypesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.types = buildUnnamed2225();
+    o.types = buildUnnamed2212();
   }
   buildCounterTypesListResponse--;
   return o;
@@ -1524,12 +1523,11 @@
   buildCounterTypesListResponse++;
   if (buildCounterTypesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2225(o.types);
+    checkUnnamed2212(o.types);
   }
   buildCounterTypesListResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-AuditConfig", () {
     unittest.test("to-json--from-json", () {
@@ -1539,7 +1537,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLogConfig();
@@ -1548,7 +1545,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthorizationLoggingOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthorizationLoggingOptions();
@@ -1557,7 +1553,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -1566,7 +1561,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Condition", () {
     unittest.test("to-json--from-json", () {
       var o = buildCondition();
@@ -1575,7 +1569,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConfigFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildConfigFile();
@@ -1584,7 +1577,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Deployment", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeployment();
@@ -1593,7 +1585,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeploymentLabelEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeploymentLabelEntry();
@@ -1602,7 +1593,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeploymentUpdate", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeploymentUpdate();
@@ -1611,7 +1601,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeploymentUpdateLabelEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeploymentUpdateLabelEntry();
@@ -1620,7 +1609,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeploymentsCancelPreviewRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeploymentsCancelPreviewRequest();
@@ -1629,7 +1617,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeploymentsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeploymentsListResponse();
@@ -1638,7 +1625,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeploymentsStopRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeploymentsStopRequest();
@@ -1647,7 +1633,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Expr", () {
     unittest.test("to-json--from-json", () {
       var o = buildExpr();
@@ -1656,7 +1641,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImportFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildImportFile();
@@ -1665,7 +1649,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogConfig();
@@ -1674,7 +1657,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogConfigCloudAuditOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogConfigCloudAuditOptions();
@@ -1683,7 +1665,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogConfigCounterOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogConfigCounterOptions();
@@ -1692,7 +1673,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogConfigDataAccessOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogConfigDataAccessOptions();
@@ -1701,7 +1681,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Manifest", () {
     unittest.test("to-json--from-json", () {
       var o = buildManifest();
@@ -1710,7 +1689,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManifestsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildManifestsListResponse();
@@ -1719,7 +1697,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationErrorErrors", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationErrorErrors();
@@ -1728,7 +1705,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationError", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationError();
@@ -1737,7 +1713,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationWarningsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationWarningsData();
@@ -1746,7 +1721,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationWarnings", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationWarnings();
@@ -1755,7 +1729,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1764,7 +1737,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationsListResponse();
@@ -1773,7 +1745,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -1782,7 +1753,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceWarningsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceWarningsData();
@@ -1791,7 +1761,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceWarnings", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceWarnings();
@@ -1800,7 +1769,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Resource", () {
     unittest.test("to-json--from-json", () {
       var o = buildResource();
@@ -1809,7 +1777,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceAccessControl", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceAccessControl();
@@ -1818,7 +1785,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceUpdateErrorErrors", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceUpdateErrorErrors();
@@ -1827,7 +1793,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceUpdateError", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceUpdateError();
@@ -1836,7 +1801,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceUpdateWarningsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceUpdateWarningsData();
@@ -1845,7 +1809,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceUpdateWarnings", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceUpdateWarnings();
@@ -1854,7 +1817,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceUpdate", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceUpdate();
@@ -1863,7 +1825,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourcesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourcesListResponse();
@@ -1872,7 +1833,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Rule", () {
     unittest.test("to-json--from-json", () {
       var o = buildRule();
@@ -1881,7 +1841,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TargetConfiguration", () {
     unittest.test("to-json--from-json", () {
       var o = buildTargetConfiguration();
@@ -1890,7 +1849,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestPermissionsRequest();
@@ -1899,7 +1857,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestPermissionsResponse();
@@ -1908,7 +1865,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Type", () {
     unittest.test("to-json--from-json", () {
       var o = buildType();
@@ -1917,7 +1873,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TypesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTypesListResponse();
@@ -1926,12 +1881,11 @@
     });
   });
 
-
   unittest.group("resource-DeploymentsResourceApi", () {
     unittest.test("method--cancelPreview", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildDeploymentsCancelPreviewRequest();
       var arg_project = "foo";
       var arg_deployment = "foo";
@@ -1943,7 +1897,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1956,29 +1911,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancelPreview(arg_request, arg_project, arg_deployment).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .cancelPreview(arg_request, arg_project, arg_deployment)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_project = "foo";
       var arg_deployment = "foo";
       var arg_deletePolicy = "foo";
@@ -1987,7 +1945,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2000,30 +1959,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["deletePolicy"].first, unittest.equals(arg_deletePolicy));
-
+        unittest.expect(
+            queryMap["deletePolicy"].first, unittest.equals(arg_deletePolicy));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_deployment, deletePolicy: arg_deletePolicy).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_project, arg_deployment, deletePolicy: arg_deletePolicy)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_project = "foo";
       var arg_deployment = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2031,7 +1994,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2044,29 +2008,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeployment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_deployment).then(unittest.expectAsync1(((api.Deployment response) {
+      res
+          .get(arg_project, arg_deployment)
+          .then(unittest.expectAsync1(((api.Deployment response) {
         checkDeployment(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_project = "foo";
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2074,7 +2041,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2087,29 +2055,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_project, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_project, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildDeployment();
       var arg_project = "foo";
       var arg_preview = true;
@@ -2121,7 +2092,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2134,30 +2106,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["preview"].first, unittest.equals("$arg_preview"));
-
+        unittest.expect(
+            queryMap["preview"].first, unittest.equals("$arg_preview"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project, preview: arg_preview).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .insert(arg_request, arg_project, preview: arg_preview)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -2168,7 +2144,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2181,33 +2158,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeploymentsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.DeploymentsListResponse response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.DeploymentsListResponse response) {
         checkDeploymentsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildDeployment();
       var arg_project = "foo";
       var arg_deployment = "foo";
@@ -2222,7 +2209,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2235,32 +2223,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["createPolicy"].first, unittest.equals(arg_createPolicy));
-        unittest.expect(queryMap["deletePolicy"].first, unittest.equals(arg_deletePolicy));
-        unittest.expect(queryMap["preview"].first, unittest.equals("$arg_preview"));
-
+        unittest.expect(
+            queryMap["createPolicy"].first, unittest.equals(arg_createPolicy));
+        unittest.expect(
+            queryMap["deletePolicy"].first, unittest.equals(arg_deletePolicy));
+        unittest.expect(
+            queryMap["preview"].first, unittest.equals("$arg_preview"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_project, arg_deployment, createPolicy: arg_createPolicy, deletePolicy: arg_deletePolicy, preview: arg_preview).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_project, arg_deployment,
+              createPolicy: arg_createPolicy,
+              deletePolicy: arg_deletePolicy,
+              preview: arg_preview)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildPolicy();
       var arg_project = "foo";
       var arg_resource = "foo";
@@ -2272,7 +2269,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2285,29 +2283,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_project, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_project, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildDeploymentsStopRequest();
       var arg_project = "foo";
       var arg_deployment = "foo";
@@ -2319,7 +2320,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2332,29 +2334,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.stop(arg_request, arg_project, arg_deployment).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .stop(arg_request, arg_project, arg_deployment)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildTestPermissionsRequest();
       var arg_project = "foo";
       var arg_resource = "foo";
@@ -2366,7 +2371,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2379,29 +2385,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_project, arg_resource).then(unittest.expectAsync1(((api.TestPermissionsResponse response) {
+      res
+          .testIamPermissions(arg_request, arg_project, arg_resource)
+          .then(unittest.expectAsync1(((api.TestPermissionsResponse response) {
         checkTestPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.DeploymentsResourceApi res = new api.DeploymentmanagerApi(mock).deployments;
+      api.DeploymentsResourceApi res =
+          new api.DeploymentmanagerApi(mock).deployments;
       var arg_request = buildDeployment();
       var arg_project = "foo";
       var arg_deployment = "foo";
@@ -2416,7 +2425,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2429,36 +2439,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["createPolicy"].first, unittest.equals(arg_createPolicy));
-        unittest.expect(queryMap["deletePolicy"].first, unittest.equals(arg_deletePolicy));
-        unittest.expect(queryMap["preview"].first, unittest.equals("$arg_preview"));
-
+        unittest.expect(
+            queryMap["createPolicy"].first, unittest.equals(arg_createPolicy));
+        unittest.expect(
+            queryMap["deletePolicy"].first, unittest.equals(arg_deletePolicy));
+        unittest.expect(
+            queryMap["preview"].first, unittest.equals("$arg_preview"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_deployment, createPolicy: arg_createPolicy, deletePolicy: arg_deletePolicy, preview: arg_preview).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .update(arg_request, arg_project, arg_deployment,
+              createPolicy: arg_createPolicy,
+              deletePolicy: arg_deletePolicy,
+              preview: arg_preview)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManifestsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ManifestsResourceApi res = new api.DeploymentmanagerApi(mock).manifests;
+      api.ManifestsResourceApi res =
+          new api.DeploymentmanagerApi(mock).manifests;
       var arg_project = "foo";
       var arg_deployment = "foo";
       var arg_manifest = "foo";
@@ -2467,7 +2484,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2480,29 +2498,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManifest());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_deployment, arg_manifest).then(unittest.expectAsync1(((api.Manifest response) {
+      res
+          .get(arg_project, arg_deployment, arg_manifest)
+          .then(unittest.expectAsync1(((api.Manifest response) {
         checkManifest(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ManifestsResourceApi res = new api.DeploymentmanagerApi(mock).manifests;
+      api.ManifestsResourceApi res =
+          new api.DeploymentmanagerApi(mock).manifests;
       var arg_project = "foo";
       var arg_deployment = "foo";
       var arg_filter = "foo";
@@ -2514,7 +2535,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2527,37 +2549,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManifestsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_deployment, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ManifestsListResponse response) {
+      res
+          .list(arg_project, arg_deployment,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ManifestsListResponse response) {
         checkManifestsListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.DeploymentmanagerApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.DeploymentmanagerApi(mock).operations;
       var arg_project = "foo";
       var arg_operation = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2565,7 +2595,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2578,29 +2609,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_operation).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .get(arg_project, arg_operation)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.DeploymentmanagerApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.DeploymentmanagerApi(mock).operations;
       var arg_project = "foo";
       var arg_filter = "foo";
       var arg_maxResults = 42;
@@ -2611,7 +2645,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2624,37 +2659,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperationsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.OperationsListResponse response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.OperationsListResponse response) {
         checkOperationsListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ResourcesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesResourceApi res = new api.DeploymentmanagerApi(mock).resources;
+      api.ResourcesResourceApi res =
+          new api.DeploymentmanagerApi(mock).resources;
       var arg_project = "foo";
       var arg_deployment = "foo";
       var arg_resource = "foo";
@@ -2663,7 +2706,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2676,29 +2720,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_deployment, arg_resource).then(unittest.expectAsync1(((api.Resource response) {
+      res
+          .get(arg_project, arg_deployment, arg_resource)
+          .then(unittest.expectAsync1(((api.Resource response) {
         checkResource(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ResourcesResourceApi res = new api.DeploymentmanagerApi(mock).resources;
+      api.ResourcesResourceApi res =
+          new api.DeploymentmanagerApi(mock).resources;
       var arg_project = "foo";
       var arg_deployment = "foo";
       var arg_filter = "foo";
@@ -2710,7 +2757,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2723,35 +2771,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResourcesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_deployment, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ResourcesListResponse response) {
+      res
+          .list(arg_project, arg_deployment,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ResourcesListResponse response) {
         checkResourcesListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TypesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TypesResourceApi res = new api.DeploymentmanagerApi(mock).types;
       var arg_project = "foo";
@@ -2764,7 +2819,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -2777,31 +2833,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTypesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TypesListResponse response) {
+      res
+          .list(arg_project,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TypesListResponse response) {
         checkTypesListResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index 8927acd..a0bf773 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.discovery.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/discovery/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -72,14 +71,14 @@
   buildCounterDirectoryListItemsIcons--;
 }
 
-buildUnnamed310() {
+buildUnnamed309() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed310(core.List<core.String> o) {
+checkUnnamed309(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -97,7 +96,7 @@
     o.icons = buildDirectoryListItemsIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed310();
+    o.labels = buildUnnamed309();
     o.name = "foo";
     o.preferred = true;
     o.title = "foo";
@@ -117,7 +116,7 @@
     checkDirectoryListItemsIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed310(o.labels);
+    checkUnnamed309(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.preferred, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -126,14 +125,14 @@
   buildCounterDirectoryListItems--;
 }
 
-buildUnnamed311() {
+buildUnnamed310() {
   var o = new core.List<api.DirectoryListItems>();
   o.add(buildDirectoryListItems());
   o.add(buildDirectoryListItems());
   return o;
 }
 
-checkUnnamed311(core.List<api.DirectoryListItems> o) {
+checkUnnamed310(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectoryListItems(o[0]);
   checkDirectoryListItems(o[1]);
@@ -145,7 +144,7 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     o.discoveryVersion = "foo";
-    o.items = buildUnnamed311();
+    o.items = buildUnnamed310();
     o.kind = "foo";
   }
   buildCounterDirectoryList--;
@@ -156,12 +155,44 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
-    checkUnnamed311(o.items);
+    checkUnnamed310(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectoryList--;
 }
 
+buildUnnamed311() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed311(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterJsonSchemaAnnotations = 0;
+buildJsonSchemaAnnotations() {
+  var o = new api.JsonSchemaAnnotations();
+  buildCounterJsonSchemaAnnotations++;
+  if (buildCounterJsonSchemaAnnotations < 3) {
+    o.required = buildUnnamed311();
+  }
+  buildCounterJsonSchemaAnnotations--;
+  return o;
+}
+
+checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
+  buildCounterJsonSchemaAnnotations++;
+  if (buildCounterJsonSchemaAnnotations < 3) {
+    checkUnnamed311(o.required);
+  }
+  buildCounterJsonSchemaAnnotations--;
+}
+
 buildUnnamed312() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -175,25 +206,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterJsonSchemaAnnotations = 0;
-buildJsonSchemaAnnotations() {
-  var o = new api.JsonSchemaAnnotations();
-  buildCounterJsonSchemaAnnotations++;
-  if (buildCounterJsonSchemaAnnotations < 3) {
-    o.required = buildUnnamed312();
-  }
-  buildCounterJsonSchemaAnnotations--;
-  return o;
-}
-
-checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
-  buildCounterJsonSchemaAnnotations++;
-  if (buildCounterJsonSchemaAnnotations < 3) {
-    checkUnnamed312(o.required);
-  }
-  buildCounterJsonSchemaAnnotations--;
-}
-
 buildUnnamed313() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -208,26 +220,13 @@
 }
 
 buildUnnamed314() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed314(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed315() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed315(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed314(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -254,14 +253,14 @@
   buildCounterJsonSchemaVariantMap--;
 }
 
-buildUnnamed316() {
+buildUnnamed315() {
   var o = new core.List<api.JsonSchemaVariantMap>();
   o.add(buildJsonSchemaVariantMap());
   o.add(buildJsonSchemaVariantMap());
   return o;
 }
 
-checkUnnamed316(core.List<api.JsonSchemaVariantMap> o) {
+checkUnnamed315(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchemaVariantMap(o[0]);
   checkJsonSchemaVariantMap(o[1]);
@@ -273,7 +272,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     o.discriminant = "foo";
-    o.map = buildUnnamed316();
+    o.map = buildUnnamed315();
   }
   buildCounterJsonSchemaVariant--;
   return o;
@@ -283,7 +282,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     unittest.expect(o.discriminant, unittest.equals('foo'));
-    checkUnnamed316(o.map);
+    checkUnnamed315(o.map);
   }
   buildCounterJsonSchemaVariant--;
 }
@@ -298,8 +297,8 @@
     o.annotations = buildJsonSchemaAnnotations();
     o.default_ = "foo";
     o.description = "foo";
-    o.enum_ = buildUnnamed313();
-    o.enumDescriptions = buildUnnamed314();
+    o.enum_ = buildUnnamed312();
+    o.enumDescriptions = buildUnnamed313();
     o.format = "foo";
     o.id = "foo";
     o.items = buildJsonSchema();
@@ -307,7 +306,7 @@
     o.maximum = "foo";
     o.minimum = "foo";
     o.pattern = "foo";
-    o.properties = buildUnnamed315();
+    o.properties = buildUnnamed314();
     o.readOnly = true;
     o.repeated = true;
     o.required = true;
@@ -326,8 +325,8 @@
     checkJsonSchemaAnnotations(o.annotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed313(o.enum_);
-    checkUnnamed314(o.enumDescriptions);
+    checkUnnamed312(o.enum_);
+    checkUnnamed313(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkJsonSchema(o.items);
@@ -335,7 +334,7 @@
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed315(o.properties);
+    checkUnnamed314(o.properties);
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
@@ -356,7 +355,8 @@
   return o;
 }
 
-checkRestDescriptionAuthOauth2ScopesValue(api.RestDescriptionAuthOauth2ScopesValue o) {
+checkRestDescriptionAuthOauth2ScopesValue(
+    api.RestDescriptionAuthOauth2ScopesValue o) {
   buildCounterRestDescriptionAuthOauth2ScopesValue++;
   if (buildCounterRestDescriptionAuthOauth2ScopesValue < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
@@ -364,14 +364,15 @@
   buildCounterRestDescriptionAuthOauth2ScopesValue--;
 }
 
-buildUnnamed317() {
+buildUnnamed316() {
   var o = new core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue>();
   o["x"] = buildRestDescriptionAuthOauth2ScopesValue();
   o["y"] = buildRestDescriptionAuthOauth2ScopesValue();
   return o;
 }
 
-checkUnnamed317(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
+checkUnnamed316(
+    core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestDescriptionAuthOauth2ScopesValue(o["x"]);
   checkRestDescriptionAuthOauth2ScopesValue(o["y"]);
@@ -382,7 +383,7 @@
   var o = new api.RestDescriptionAuthOauth2();
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    o.scopes = buildUnnamed317();
+    o.scopes = buildUnnamed316();
   }
   buildCounterRestDescriptionAuthOauth2--;
   return o;
@@ -391,7 +392,7 @@
 checkRestDescriptionAuthOauth2(api.RestDescriptionAuthOauth2 o) {
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    checkUnnamed317(o.scopes);
+    checkUnnamed316(o.scopes);
   }
   buildCounterRestDescriptionAuthOauth2--;
 }
@@ -415,14 +416,14 @@
   buildCounterRestDescriptionAuth--;
 }
 
-buildUnnamed318() {
+buildUnnamed317() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed318(core.List<core.String> o) {
+checkUnnamed317(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -449,66 +450,66 @@
   buildCounterRestDescriptionIcons--;
 }
 
-buildUnnamed319() {
+buildUnnamed318() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed319(core.List<core.String> o) {
+checkUnnamed318(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed320() {
+buildUnnamed319() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed320(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed319(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed321() {
+buildUnnamed320() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed321(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed320(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
 }
 
-buildUnnamed322() {
+buildUnnamed321() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed322(core.Map<core.String, api.RestResource> o) {
+checkUnnamed321(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
 }
 
-buildUnnamed323() {
+buildUnnamed322() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed323(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed322(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -529,22 +530,22 @@
     o.documentationLink = "foo";
     o.etag = "foo";
     o.exponentialBackoffDefault = true;
-    o.features = buildUnnamed318();
+    o.features = buildUnnamed317();
     o.icons = buildRestDescriptionIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed319();
-    o.methods = buildUnnamed320();
+    o.labels = buildUnnamed318();
+    o.methods = buildUnnamed319();
     o.name = "foo";
     o.ownerDomain = "foo";
     o.ownerName = "foo";
     o.packagePath = "foo";
-    o.parameters = buildUnnamed321();
+    o.parameters = buildUnnamed320();
     o.protocol = "foo";
-    o.resources = buildUnnamed322();
+    o.resources = buildUnnamed321();
     o.revision = "foo";
     o.rootUrl = "foo";
-    o.schemas = buildUnnamed323();
+    o.schemas = buildUnnamed322();
     o.servicePath = "foo";
     o.title = "foo";
     o.version = "foo";
@@ -567,22 +568,22 @@
     unittest.expect(o.documentationLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.exponentialBackoffDefault, unittest.isTrue);
-    checkUnnamed318(o.features);
+    checkUnnamed317(o.features);
     checkRestDescriptionIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed319(o.labels);
-    checkUnnamed320(o.methods);
+    checkUnnamed318(o.labels);
+    checkUnnamed319(o.methods);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ownerDomain, unittest.equals('foo'));
     unittest.expect(o.ownerName, unittest.equals('foo'));
     unittest.expect(o.packagePath, unittest.equals('foo'));
-    checkUnnamed321(o.parameters);
+    checkUnnamed320(o.parameters);
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkUnnamed322(o.resources);
+    checkUnnamed321(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     unittest.expect(o.rootUrl, unittest.equals('foo'));
-    checkUnnamed323(o.schemas);
+    checkUnnamed322(o.schemas);
     unittest.expect(o.servicePath, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -591,14 +592,14 @@
   buildCounterRestDescription--;
 }
 
-buildUnnamed324() {
+buildUnnamed323() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed324(core.List<core.String> o) {
+checkUnnamed323(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -616,7 +617,8 @@
   return o;
 }
 
-checkRestMethodMediaUploadProtocolsResumable(api.RestMethodMediaUploadProtocolsResumable o) {
+checkRestMethodMediaUploadProtocolsResumable(
+    api.RestMethodMediaUploadProtocolsResumable o) {
   buildCounterRestMethodMediaUploadProtocolsResumable++;
   if (buildCounterRestMethodMediaUploadProtocolsResumable < 3) {
     unittest.expect(o.multipart, unittest.isTrue);
@@ -637,7 +639,8 @@
   return o;
 }
 
-checkRestMethodMediaUploadProtocolsSimple(api.RestMethodMediaUploadProtocolsSimple o) {
+checkRestMethodMediaUploadProtocolsSimple(
+    api.RestMethodMediaUploadProtocolsSimple o) {
   buildCounterRestMethodMediaUploadProtocolsSimple++;
   if (buildCounterRestMethodMediaUploadProtocolsSimple < 3) {
     unittest.expect(o.multipart, unittest.isTrue);
@@ -672,7 +675,7 @@
   var o = new api.RestMethodMediaUpload();
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    o.accept = buildUnnamed324();
+    o.accept = buildUnnamed323();
     o.maxSize = "foo";
     o.protocols = buildRestMethodMediaUploadProtocols();
   }
@@ -683,34 +686,34 @@
 checkRestMethodMediaUpload(api.RestMethodMediaUpload o) {
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    checkUnnamed324(o.accept);
+    checkUnnamed323(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
     checkRestMethodMediaUploadProtocols(o.protocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
 
-buildUnnamed325() {
+buildUnnamed324() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed325(core.List<core.String> o) {
+checkUnnamed324(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed326() {
+buildUnnamed325() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed326(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed325(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -756,14 +759,14 @@
   buildCounterRestMethodResponse--;
 }
 
-buildUnnamed327() {
+buildUnnamed326() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed327(core.List<core.String> o) {
+checkUnnamed326(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -779,12 +782,12 @@
     o.httpMethod = "foo";
     o.id = "foo";
     o.mediaUpload = buildRestMethodMediaUpload();
-    o.parameterOrder = buildUnnamed325();
-    o.parameters = buildUnnamed326();
+    o.parameterOrder = buildUnnamed324();
+    o.parameters = buildUnnamed325();
     o.path = "foo";
     o.request = buildRestMethodRequest();
     o.response = buildRestMethodResponse();
-    o.scopes = buildUnnamed327();
+    o.scopes = buildUnnamed326();
     o.supportsMediaDownload = true;
     o.supportsMediaUpload = true;
     o.supportsSubscription = true;
@@ -802,12 +805,12 @@
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkRestMethodMediaUpload(o.mediaUpload);
-    checkUnnamed325(o.parameterOrder);
-    checkUnnamed326(o.parameters);
+    checkUnnamed324(o.parameterOrder);
+    checkUnnamed325(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
     checkRestMethodRequest(o.request);
     checkRestMethodResponse(o.response);
-    checkUnnamed327(o.scopes);
+    checkUnnamed326(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
     unittest.expect(o.supportsSubscription, unittest.isTrue);
@@ -816,27 +819,27 @@
   buildCounterRestMethod--;
 }
 
-buildUnnamed328() {
+buildUnnamed327() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed328(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed327(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed329() {
+buildUnnamed328() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed329(core.Map<core.String, api.RestResource> o) {
+checkUnnamed328(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
@@ -847,8 +850,8 @@
   var o = new api.RestResource();
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    o.methods = buildUnnamed328();
-    o.resources = buildUnnamed329();
+    o.methods = buildUnnamed327();
+    o.resources = buildUnnamed328();
   }
   buildCounterRestResource--;
   return o;
@@ -857,13 +860,12 @@
 checkRestResource(api.RestResource o) {
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    checkUnnamed328(o.methods);
-    checkUnnamed329(o.resources);
+    checkUnnamed327(o.methods);
+    checkUnnamed328(o.resources);
   }
   buildCounterRestResource--;
 }
 
-
 main() {
   unittest.group("obj-schema-DirectoryListItemsIcons", () {
     unittest.test("to-json--from-json", () {
@@ -873,7 +875,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DirectoryListItems", () {
     unittest.test("to-json--from-json", () {
       var o = buildDirectoryListItems();
@@ -882,7 +883,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DirectoryList", () {
     unittest.test("to-json--from-json", () {
       var o = buildDirectoryList();
@@ -891,7 +891,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JsonSchemaAnnotations", () {
     unittest.test("to-json--from-json", () {
       var o = buildJsonSchemaAnnotations();
@@ -900,7 +899,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JsonSchemaVariantMap", () {
     unittest.test("to-json--from-json", () {
       var o = buildJsonSchemaVariantMap();
@@ -909,7 +907,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JsonSchemaVariant", () {
     unittest.test("to-json--from-json", () {
       var o = buildJsonSchemaVariant();
@@ -918,7 +915,6 @@
     });
   });
 
-
   unittest.group("obj-schema-JsonSchema", () {
     unittest.test("to-json--from-json", () {
       var o = buildJsonSchema();
@@ -927,16 +923,15 @@
     });
   });
 
-
   unittest.group("obj-schema-RestDescriptionAuthOauth2ScopesValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestDescriptionAuthOauth2ScopesValue();
-      var od = new api.RestDescriptionAuthOauth2ScopesValue.fromJson(o.toJson());
+      var od =
+          new api.RestDescriptionAuthOauth2ScopesValue.fromJson(o.toJson());
       checkRestDescriptionAuthOauth2ScopesValue(od);
     });
   });
 
-
   unittest.group("obj-schema-RestDescriptionAuthOauth2", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestDescriptionAuthOauth2();
@@ -945,7 +940,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestDescriptionAuth", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestDescriptionAuth();
@@ -954,7 +948,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestDescriptionIcons", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestDescriptionIcons();
@@ -963,7 +956,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestDescription", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestDescription();
@@ -972,25 +964,24 @@
     });
   });
 
-
   unittest.group("obj-schema-RestMethodMediaUploadProtocolsResumable", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethodMediaUploadProtocolsResumable();
-      var od = new api.RestMethodMediaUploadProtocolsResumable.fromJson(o.toJson());
+      var od =
+          new api.RestMethodMediaUploadProtocolsResumable.fromJson(o.toJson());
       checkRestMethodMediaUploadProtocolsResumable(od);
     });
   });
 
-
   unittest.group("obj-schema-RestMethodMediaUploadProtocolsSimple", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethodMediaUploadProtocolsSimple();
-      var od = new api.RestMethodMediaUploadProtocolsSimple.fromJson(o.toJson());
+      var od =
+          new api.RestMethodMediaUploadProtocolsSimple.fromJson(o.toJson());
       checkRestMethodMediaUploadProtocolsSimple(od);
     });
   });
 
-
   unittest.group("obj-schema-RestMethodMediaUploadProtocols", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethodMediaUploadProtocols();
@@ -999,7 +990,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestMethodMediaUpload", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethodMediaUpload();
@@ -1008,7 +998,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestMethodRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethodRequest();
@@ -1017,7 +1006,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestMethodResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethodResponse();
@@ -1026,7 +1014,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestMethod", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestMethod();
@@ -1035,7 +1022,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RestResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildRestResource();
@@ -1044,10 +1030,8 @@
     });
   });
 
-
   unittest.group("resource-ApisResourceApi", () {
     unittest.test("method--getRest", () {
-
       var mock = new HttpServerMock();
       api.ApisResourceApi res = new api.DiscoveryApi(mock).apis;
       var arg_api = "foo";
@@ -1057,25 +1041,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("discovery/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("discovery/v1/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("apis/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("apis/"));
         pathOffset += 5;
         index = path.indexOf("/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_api"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
         index = path.indexOf("/rest", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_version"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/rest"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/rest"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1088,27 +1079,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRestDescription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getRest(arg_api, arg_version).then(unittest.expectAsync1(((api.RestDescription response) {
+      res
+          .getRest(arg_api, arg_version)
+          .then(unittest.expectAsync1(((api.RestDescription response) {
         checkRestDescription(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ApisResourceApi res = new api.DiscoveryApi(mock).apis;
       var arg_name = "foo";
@@ -1118,11 +1111,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("discovery/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("discovery/v1/"));
         pathOffset += 13;
-        unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals("apis"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 4),
+            unittest.equals("apis"));
         pathOffset += 4;
 
         var query = (req.url).query;
@@ -1135,29 +1131,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-        unittest.expect(queryMap["preferred"].first, unittest.equals("$arg_preferred"));
-
+        unittest.expect(
+            queryMap["preferred"].first, unittest.equals("$arg_preferred"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDirectoryList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(name: arg_name, preferred: arg_preferred).then(unittest.expectAsync1(((api.DirectoryList response) {
+      res
+          .list(name: arg_name, preferred: arg_preferred)
+          .then(unittest.expectAsync1(((api.DirectoryList response) {
         checkDirectoryList(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/dns/v1_test.dart b/generated/googleapis/test/dns/v1_test.dart
index f755a1f..aef0cc0 100644
--- a/generated/googleapis/test/dns/v1_test.dart
+++ b/generated/googleapis/test/dns/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.dns.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/dns/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,33 +44,33 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed792() {
+buildUnnamed795() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed792(core.List<api.ResourceRecordSet> o) {
+checkUnnamed795(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
 }
 
-buildUnnamed793() {
+buildUnnamed796() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed793(core.List<api.ResourceRecordSet> o) {
+checkUnnamed796(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -82,8 +81,8 @@
   var o = new api.Change();
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    o.additions = buildUnnamed792();
-    o.deletions = buildUnnamed793();
+    o.additions = buildUnnamed795();
+    o.deletions = buildUnnamed796();
     o.id = "foo";
     o.kind = "foo";
     o.startTime = "foo";
@@ -96,8 +95,8 @@
 checkChange(api.Change o) {
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    checkUnnamed792(o.additions);
-    checkUnnamed793(o.deletions);
+    checkUnnamed795(o.additions);
+    checkUnnamed796(o.deletions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -106,14 +105,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed794() {
+buildUnnamed797() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed794(core.List<api.Change> o) {
+checkUnnamed797(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -124,7 +123,7 @@
   var o = new api.ChangesListResponse();
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    o.changes = buildUnnamed794();
+    o.changes = buildUnnamed797();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,21 +134,21 @@
 checkChangesListResponse(api.ChangesListResponse o) {
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    checkUnnamed794(o.changes);
+    checkUnnamed797(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangesListResponse--;
 }
 
-buildUnnamed795() {
+buildUnnamed798() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed795(core.List<core.String> o) {
+checkUnnamed798(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -167,7 +166,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.nameServerSet = "foo";
-    o.nameServers = buildUnnamed795();
+    o.nameServers = buildUnnamed798();
   }
   buildCounterManagedZone--;
   return o;
@@ -183,19 +182,19 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nameServerSet, unittest.equals('foo'));
-    checkUnnamed795(o.nameServers);
+    checkUnnamed798(o.nameServers);
   }
   buildCounterManagedZone--;
 }
 
-buildUnnamed796() {
+buildUnnamed799() {
   var o = new core.List<api.ManagedZone>();
   o.add(buildManagedZone());
   o.add(buildManagedZone());
   return o;
 }
 
-checkUnnamed796(core.List<api.ManagedZone> o) {
+checkUnnamed799(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedZone(o[0]);
   checkManagedZone(o[1]);
@@ -207,7 +206,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     o.kind = "foo";
-    o.managedZones = buildUnnamed796();
+    o.managedZones = buildUnnamed799();
     o.nextPageToken = "foo";
   }
   buildCounterManagedZonesListResponse--;
@@ -218,7 +217,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed796(o.managedZones);
+    checkUnnamed799(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManagedZonesListResponse--;
@@ -280,14 +279,14 @@
   buildCounterQuota--;
 }
 
-buildUnnamed797() {
+buildUnnamed800() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed797(core.List<core.String> o) {
+checkUnnamed800(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -300,7 +299,7 @@
   if (buildCounterResourceRecordSet < 3) {
     o.kind = "foo";
     o.name = "foo";
-    o.rrdatas = buildUnnamed797();
+    o.rrdatas = buildUnnamed800();
     o.ttl = 42;
     o.type = "foo";
   }
@@ -313,21 +312,21 @@
   if (buildCounterResourceRecordSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed797(o.rrdatas);
+    checkUnnamed800(o.rrdatas);
     unittest.expect(o.ttl, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterResourceRecordSet--;
 }
 
-buildUnnamed798() {
+buildUnnamed801() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed798(core.List<api.ResourceRecordSet> o) {
+checkUnnamed801(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -340,7 +339,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.rrsets = buildUnnamed798();
+    o.rrsets = buildUnnamed801();
   }
   buildCounterResourceRecordSetsListResponse--;
   return o;
@@ -351,12 +350,11 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed798(o.rrsets);
+    checkUnnamed801(o.rrsets);
   }
   buildCounterResourceRecordSetsListResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-Change", () {
     unittest.test("to-json--from-json", () {
@@ -366,7 +364,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChangesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildChangesListResponse();
@@ -375,7 +372,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedZone", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedZone();
@@ -384,7 +380,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedZonesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedZonesListResponse();
@@ -393,7 +388,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Project", () {
     unittest.test("to-json--from-json", () {
       var o = buildProject();
@@ -402,7 +396,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Quota", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuota();
@@ -411,7 +404,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceRecordSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceRecordSet();
@@ -420,7 +412,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceRecordSetsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceRecordSetsListResponse();
@@ -429,10 +420,8 @@
     });
   });
 
-
   unittest.group("resource-ChangesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DnsApi(mock).changes;
       var arg_request = buildChange();
@@ -446,7 +435,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -459,27 +449,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChange());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_project, arg_managedZone).then(unittest.expectAsync1(((api.Change response) {
+      res
+          .create(arg_request, arg_project, arg_managedZone)
+          .then(unittest.expectAsync1(((api.Change response) {
         checkChange(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DnsApi(mock).changes;
       var arg_project = "foo";
@@ -490,7 +482,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -503,27 +496,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChange());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_managedZone, arg_changeId).then(unittest.expectAsync1(((api.Change response) {
+      res
+          .get(arg_project, arg_managedZone, arg_changeId)
+          .then(unittest.expectAsync1(((api.Change response) {
         checkChange(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DnsApi(mock).changes;
       var arg_project = "foo";
@@ -537,7 +532,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -550,35 +546,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["sortBy"].first, unittest.equals(arg_sortBy));
-        unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
-
+        unittest.expect(
+            queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChangesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_managedZone, maxResults: arg_maxResults, pageToken: arg_pageToken, sortBy: arg_sortBy, sortOrder: arg_sortOrder).then(unittest.expectAsync1(((api.ChangesListResponse response) {
+      res
+          .list(arg_project, arg_managedZone,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              sortBy: arg_sortBy,
+              sortOrder: arg_sortOrder)
+          .then(unittest.expectAsync1(((api.ChangesListResponse response) {
         checkChangesListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ManagedZonesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.ManagedZonesResourceApi res = new api.DnsApi(mock).managedZones;
       var arg_request = buildManagedZone();
@@ -591,7 +594,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -604,27 +608,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedZone());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_project).then(unittest.expectAsync1(((api.ManagedZone response) {
+      res
+          .create(arg_request, arg_project)
+          .then(unittest.expectAsync1(((api.ManagedZone response) {
         checkManagedZone(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ManagedZonesResourceApi res = new api.DnsApi(mock).managedZones;
       var arg_project = "foo";
@@ -634,7 +640,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -647,25 +654,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_project, arg_managedZone).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_project, arg_managedZone)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ManagedZonesResourceApi res = new api.DnsApi(mock).managedZones;
       var arg_project = "foo";
@@ -675,7 +684,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -688,27 +698,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedZone());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_managedZone).then(unittest.expectAsync1(((api.ManagedZone response) {
+      res
+          .get(arg_project, arg_managedZone)
+          .then(unittest.expectAsync1(((api.ManagedZone response) {
         checkManagedZone(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ManagedZonesResourceApi res = new api.DnsApi(mock).managedZones;
       var arg_project = "foo";
@@ -720,7 +732,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -733,34 +746,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["dnsName"].first, unittest.equals(arg_dnsName));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["dnsName"].first, unittest.equals(arg_dnsName));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedZonesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, dnsName: arg_dnsName, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ManagedZonesListResponse response) {
+      res
+          .list(arg_project,
+              dnsName: arg_dnsName,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ManagedZonesListResponse response) {
         checkManagedZonesListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.DnsApi(mock).projects;
       var arg_project = "foo";
@@ -769,7 +788,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -782,16 +802,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProject());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -800,15 +821,13 @@
         checkProject(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ResourceRecordSetsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ResourceRecordSetsResourceApi res = new api.DnsApi(mock).resourceRecordSets;
+      api.ResourceRecordSetsResourceApi res =
+          new api.DnsApi(mock).resourceRecordSets;
       var arg_project = "foo";
       var arg_managedZone = "foo";
       var arg_maxResults = 42;
@@ -820,7 +839,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -833,31 +853,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["type"].first, unittest.equals(arg_type));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResourceRecordSetsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, arg_managedZone, maxResults: arg_maxResults, name: arg_name, pageToken: arg_pageToken, type: arg_type).then(unittest.expectAsync1(((api.ResourceRecordSetsListResponse response) {
+      res
+          .list(arg_project, arg_managedZone,
+              maxResults: arg_maxResults,
+              name: arg_name,
+              pageToken: arg_pageToken,
+              type: arg_type)
+          .then(unittest
+              .expectAsync1(((api.ResourceRecordSetsListResponse response) {
         checkResourceRecordSetsListResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
index d0a8153..67d0e52 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.doubleclickbidmanager.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/doubleclickbidmanager/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1261() {
+buildUnnamed1257() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1261(core.List<core.String> o) {
+checkUnnamed1257(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -70,7 +69,7 @@
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
     o.fileSpec = "foo";
-    o.filterIds = buildUnnamed1261();
+    o.filterIds = buildUnnamed1257();
     o.filterType = "foo";
     o.format = "foo";
   }
@@ -82,7 +81,7 @@
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
     unittest.expect(o.fileSpec, unittest.equals('foo'));
-    checkUnnamed1261(o.filterIds);
+    checkUnnamed1257(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -108,27 +107,27 @@
   buildCounterDownloadLineItemsResponse--;
 }
 
-buildUnnamed1262() {
+buildUnnamed1258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1262(core.List<core.String> o) {
+checkUnnamed1258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1263() {
+buildUnnamed1259() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1263(core.List<core.String> o) {
+checkUnnamed1259(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -139,8 +138,8 @@
   var o = new api.DownloadRequest();
   buildCounterDownloadRequest++;
   if (buildCounterDownloadRequest < 3) {
-    o.fileTypes = buildUnnamed1262();
-    o.filterIds = buildUnnamed1263();
+    o.fileTypes = buildUnnamed1258();
+    o.filterIds = buildUnnamed1259();
     o.filterType = "foo";
     o.version = "foo";
   }
@@ -151,8 +150,8 @@
 checkDownloadRequest(api.DownloadRequest o) {
   buildCounterDownloadRequest++;
   if (buildCounterDownloadRequest < 3) {
-    checkUnnamed1262(o.fileTypes);
-    checkUnnamed1263(o.filterIds);
+    checkUnnamed1258(o.fileTypes);
+    checkUnnamed1259(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -205,14 +204,14 @@
   buildCounterFilterPair--;
 }
 
-buildUnnamed1264() {
+buildUnnamed1260() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed1264(core.List<api.Query> o) {
+checkUnnamed1260(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
@@ -224,7 +223,7 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     o.kind = "foo";
-    o.queries = buildUnnamed1264();
+    o.queries = buildUnnamed1260();
   }
   buildCounterListQueriesResponse--;
   return o;
@@ -234,19 +233,19 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1264(o.queries);
+    checkUnnamed1260(o.queries);
   }
   buildCounterListQueriesResponse--;
 }
 
-buildUnnamed1265() {
+buildUnnamed1261() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed1265(core.List<api.Report> o) {
+checkUnnamed1261(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -258,7 +257,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.kind = "foo";
-    o.reports = buildUnnamed1265();
+    o.reports = buildUnnamed1261();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -268,45 +267,45 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1265(o.reports);
+    checkUnnamed1261(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-buildUnnamed1266() {
+buildUnnamed1262() {
   var o = new core.List<api.FilterPair>();
   o.add(buildFilterPair());
   o.add(buildFilterPair());
   return o;
 }
 
-checkUnnamed1266(core.List<api.FilterPair> o) {
+checkUnnamed1262(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterPair(o[0]);
   checkFilterPair(o[1]);
 }
 
-buildUnnamed1267() {
+buildUnnamed1263() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1267(core.List<core.String> o) {
+checkUnnamed1263(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1268() {
+buildUnnamed1264() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1268(core.List<core.String> o) {
+checkUnnamed1264(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -317,10 +316,10 @@
   var o = new api.Parameters();
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    o.filters = buildUnnamed1266();
-    o.groupBys = buildUnnamed1267();
+    o.filters = buildUnnamed1262();
+    o.groupBys = buildUnnamed1263();
     o.includeInviteData = true;
-    o.metrics = buildUnnamed1268();
+    o.metrics = buildUnnamed1264();
     o.type = "foo";
   }
   buildCounterParameters--;
@@ -330,10 +329,10 @@
 checkParameters(api.Parameters o) {
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    checkUnnamed1266(o.filters);
-    checkUnnamed1267(o.groupBys);
+    checkUnnamed1262(o.filters);
+    checkUnnamed1263(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
-    checkUnnamed1268(o.metrics);
+    checkUnnamed1264(o.metrics);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -372,14 +371,14 @@
   buildCounterQuery--;
 }
 
-buildUnnamed1269() {
+buildUnnamed1265() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1269(core.List<core.String> o) {
+checkUnnamed1265(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,7 +398,7 @@
     o.reportCount = 42;
     o.running = true;
     o.sendNotification = true;
-    o.shareEmailAddress = buildUnnamed1269();
+    o.shareEmailAddress = buildUnnamed1265();
     o.title = "foo";
   }
   buildCounterQueryMetadata--;
@@ -411,14 +410,15 @@
   if (buildCounterQueryMetadata < 3) {
     unittest.expect(o.dataRange, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
-    unittest.expect(o.googleCloudStoragePathForLatestReport, unittest.equals('foo'));
+    unittest.expect(
+        o.googleCloudStoragePathForLatestReport, unittest.equals('foo'));
     unittest.expect(o.googleDrivePathForLatestReport, unittest.equals('foo'));
     unittest.expect(o.latestReportRunTimeMs, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
     unittest.expect(o.reportCount, unittest.equals(42));
     unittest.expect(o.running, unittest.isTrue);
     unittest.expect(o.sendNotification, unittest.isTrue);
-    checkUnnamed1269(o.shareEmailAddress);
+    checkUnnamed1265(o.shareEmailAddress);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterQueryMetadata--;
@@ -562,14 +562,14 @@
   buildCounterReportStatus--;
 }
 
-buildUnnamed1270() {
+buildUnnamed1266() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1270(core.List<core.String> o) {
+checkUnnamed1266(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -583,7 +583,7 @@
     o.changed = true;
     o.entityId = "foo";
     o.entityName = "foo";
-    o.errors = buildUnnamed1270();
+    o.errors = buildUnnamed1266();
     o.persisted = true;
     o.rowNumber = 42;
   }
@@ -597,7 +597,7 @@
     unittest.expect(o.changed, unittest.isTrue);
     unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.entityName, unittest.equals('foo'));
-    checkUnnamed1270(o.errors);
+    checkUnnamed1266(o.errors);
     unittest.expect(o.persisted, unittest.isTrue);
     unittest.expect(o.rowNumber, unittest.equals(42));
   }
@@ -671,27 +671,27 @@
   buildCounterUploadLineItemsResponse--;
 }
 
-buildUnnamed1271() {
+buildUnnamed1267() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1271(core.List<core.String> o) {
+checkUnnamed1267(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1272() {
+buildUnnamed1268() {
   var o = new core.List<api.RowStatus>();
   o.add(buildRowStatus());
   o.add(buildRowStatus());
   return o;
 }
 
-checkUnnamed1272(core.List<api.RowStatus> o) {
+checkUnnamed1268(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowStatus(o[0]);
   checkRowStatus(o[1]);
@@ -702,8 +702,8 @@
   var o = new api.UploadStatus();
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    o.errors = buildUnnamed1271();
-    o.rowStatus = buildUnnamed1272();
+    o.errors = buildUnnamed1267();
+    o.rowStatus = buildUnnamed1268();
   }
   buildCounterUploadStatus--;
   return o;
@@ -712,13 +712,12 @@
 checkUploadStatus(api.UploadStatus o) {
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    checkUnnamed1271(o.errors);
-    checkUnnamed1272(o.rowStatus);
+    checkUnnamed1267(o.errors);
+    checkUnnamed1268(o.rowStatus);
   }
   buildCounterUploadStatus--;
 }
 
-
 main() {
   unittest.group("obj-schema-DownloadLineItemsRequest", () {
     unittest.test("to-json--from-json", () {
@@ -728,7 +727,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DownloadLineItemsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDownloadLineItemsResponse();
@@ -737,7 +735,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DownloadRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDownloadRequest();
@@ -746,7 +743,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DownloadResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDownloadResponse();
@@ -755,7 +751,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FilterPair", () {
     unittest.test("to-json--from-json", () {
       var o = buildFilterPair();
@@ -764,7 +759,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListQueriesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListQueriesResponse();
@@ -773,7 +767,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListReportsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListReportsResponse();
@@ -782,7 +775,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Parameters", () {
     unittest.test("to-json--from-json", () {
       var o = buildParameters();
@@ -791,7 +783,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Query", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuery();
@@ -800,7 +791,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QueryMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildQueryMetadata();
@@ -809,7 +799,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuerySchedule", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuerySchedule();
@@ -818,7 +807,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Report", () {
     unittest.test("to-json--from-json", () {
       var o = buildReport();
@@ -827,7 +815,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportFailure", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportFailure();
@@ -836,7 +823,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportKey", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportKey();
@@ -845,7 +831,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportMetadata();
@@ -854,7 +839,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportStatus();
@@ -863,7 +847,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RowStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildRowStatus();
@@ -872,7 +855,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RunQueryRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRunQueryRequest();
@@ -881,7 +863,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UploadLineItemsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUploadLineItemsRequest();
@@ -890,7 +871,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UploadLineItemsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUploadLineItemsResponse();
@@ -899,7 +879,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UploadStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildUploadStatus();
@@ -908,12 +887,11 @@
     });
   });
 
-
   unittest.group("resource-LineitemsResourceApi", () {
     unittest.test("method--downloadlineitems", () {
-
       var mock = new HttpServerMock();
-      api.LineitemsResourceApi res = new api.DoubleclickbidmanagerApi(mock).lineitems;
+      api.LineitemsResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).lineitems;
       var arg_request = buildDownloadLineItemsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.DownloadLineItemsRequest.fromJson(json);
@@ -923,11 +901,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("lineitems/downloadlineitems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 27),
+            unittest.equals("lineitems/downloadlineitems"));
         pathOffset += 27;
 
         var query = (req.url).query;
@@ -940,29 +921,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDownloadLineItemsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.downloadlineitems(arg_request).then(unittest.expectAsync1(((api.DownloadLineItemsResponse response) {
+      res.downloadlineitems(arg_request).then(
+          unittest.expectAsync1(((api.DownloadLineItemsResponse response) {
         checkDownloadLineItemsResponse(response);
       })));
     });
 
     unittest.test("method--uploadlineitems", () {
-
       var mock = new HttpServerMock();
-      api.LineitemsResourceApi res = new api.DoubleclickbidmanagerApi(mock).lineitems;
+      api.LineitemsResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).lineitems;
       var arg_request = buildUploadLineItemsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.UploadLineItemsRequest.fromJson(json);
@@ -972,11 +955,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("lineitems/uploadlineitems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("lineitems/uploadlineitems"));
         pathOffset += 25;
 
         var query = (req.url).query;
@@ -989,33 +975,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUploadLineItemsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.uploadlineitems(arg_request).then(unittest.expectAsync1(((api.UploadLineItemsResponse response) {
+      res
+          .uploadlineitems(arg_request)
+          .then(unittest.expectAsync1(((api.UploadLineItemsResponse response) {
         checkUploadLineItemsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-QueriesResourceApi", () {
     unittest.test("method--createquery", () {
-
       var mock = new HttpServerMock();
-      api.QueriesResourceApi res = new api.DoubleclickbidmanagerApi(mock).queries;
+      api.QueriesResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).queries;
       var arg_request = buildQuery();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Query.fromJson(json);
@@ -1025,11 +1012,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("query"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1042,40 +1032,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildQuery());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.createquery(arg_request).then(unittest.expectAsync1(((api.Query response) {
+      res
+          .createquery(arg_request)
+          .then(unittest.expectAsync1(((api.Query response) {
         checkQuery(response);
       })));
     });
 
     unittest.test("method--deletequery", () {
-
       var mock = new HttpServerMock();
-      api.QueriesResourceApi res = new api.DoubleclickbidmanagerApi(mock).queries;
+      api.QueriesResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).queries;
       var arg_queryId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("query/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("query/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1091,16 +1087,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1109,20 +1106,23 @@
     });
 
     unittest.test("method--getquery", () {
-
       var mock = new HttpServerMock();
-      api.QueriesResourceApi res = new api.DoubleclickbidmanagerApi(mock).queries;
+      api.QueriesResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).queries;
       var arg_queryId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("query/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("query/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1138,39 +1138,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildQuery());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getquery(arg_queryId).then(unittest.expectAsync1(((api.Query response) {
+      res
+          .getquery(arg_queryId)
+          .then(unittest.expectAsync1(((api.Query response) {
         checkQuery(response);
       })));
     });
 
     unittest.test("method--listqueries", () {
-
       var mock = new HttpServerMock();
-      api.QueriesResourceApi res = new api.DoubleclickbidmanagerApi(mock).queries;
+      api.QueriesResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).queries;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("queries"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("queries"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1183,29 +1189,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListQueriesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listqueries().then(unittest.expectAsync1(((api.ListQueriesResponse response) {
+      res
+          .listqueries()
+          .then(unittest.expectAsync1(((api.ListQueriesResponse response) {
         checkListQueriesResponse(response);
       })));
     });
 
     unittest.test("method--runquery", () {
-
       var mock = new HttpServerMock();
-      api.QueriesResourceApi res = new api.DoubleclickbidmanagerApi(mock).queries;
+      api.QueriesResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).queries;
       var arg_request = buildRunQueryRequest();
       var arg_queryId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1216,11 +1225,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("query/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("query/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1236,49 +1248,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.runquery(arg_request, arg_queryId).then(unittest.expectAsync1((_) {}));
+      res
+          .runquery(arg_request, arg_queryId)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-ReportsResourceApi", () {
     unittest.test("method--listreports", () {
-
       var mock = new HttpServerMock();
-      api.ReportsResourceApi res = new api.DoubleclickbidmanagerApi(mock).reports;
+      api.ReportsResourceApi res =
+          new api.DoubleclickbidmanagerApi(mock).reports;
       var arg_queryId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("queries/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("queries/"));
         pathOffset += 8;
         index = path.indexOf("/reports", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_queryId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/reports"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/reports"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1291,31 +1309,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListReportsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listreports(arg_queryId).then(unittest.expectAsync1(((api.ListReportsResponse response) {
+      res
+          .listreports(arg_queryId)
+          .then(unittest.expectAsync1(((api.ListReportsResponse response) {
         checkListReportsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SdfResourceApi", () {
     unittest.test("method--download", () {
-
       var mock = new HttpServerMock();
       api.SdfResourceApi res = new api.DoubleclickbidmanagerApi(mock).sdf;
       var arg_request = buildDownloadRequest();
@@ -1327,11 +1345,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("doubleclickbidmanager/v1/"));
         pathOffset += 25;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sdf/download"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("sdf/download"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1344,27 +1365,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDownloadResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.download(arg_request).then(unittest.expectAsync1(((api.DownloadResponse response) {
+      res
+          .download(arg_request)
+          .then(unittest.expectAsync1(((api.DownloadResponse response) {
         checkDownloadResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index 6a10df0..54e8b4f 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.doubleclicksearch.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/doubleclicksearch/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -80,27 +79,27 @@
   buildCounterAvailability--;
 }
 
-buildUnnamed1443() {
+buildUnnamed1433() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed1443(core.List<api.CustomDimension> o) {
+checkUnnamed1433(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
 }
 
-buildUnnamed1444() {
+buildUnnamed1434() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed1444(core.List<api.CustomMetric> o) {
+checkUnnamed1434(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -125,8 +124,8 @@
     o.countMillis = "foo";
     o.criterionId = "foo";
     o.currencyCode = "foo";
-    o.customDimension = buildUnnamed1443();
-    o.customMetric = buildUnnamed1444();
+    o.customDimension = buildUnnamed1433();
+    o.customMetric = buildUnnamed1434();
     o.deviceType = "foo";
     o.dsConversionId = "foo";
     o.engineAccountId = "foo";
@@ -166,8 +165,8 @@
     unittest.expect(o.countMillis, unittest.equals('foo'));
     unittest.expect(o.criterionId, unittest.equals('foo'));
     unittest.expect(o.currencyCode, unittest.equals('foo'));
-    checkUnnamed1443(o.customDimension);
-    checkUnnamed1444(o.customMetric);
+    checkUnnamed1433(o.customDimension);
+    checkUnnamed1434(o.customMetric);
     unittest.expect(o.deviceType, unittest.equals('foo'));
     unittest.expect(o.dsConversionId, unittest.equals('foo'));
     unittest.expect(o.engineAccountId, unittest.equals('foo'));
@@ -189,14 +188,14 @@
   buildCounterConversion--;
 }
 
-buildUnnamed1445() {
+buildUnnamed1435() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed1445(core.List<api.Conversion> o) {
+checkUnnamed1435(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -207,7 +206,7 @@
   var o = new api.ConversionList();
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    o.conversion = buildUnnamed1445();
+    o.conversion = buildUnnamed1435();
     o.kind = "foo";
   }
   buildCounterConversionList--;
@@ -217,7 +216,7 @@
 checkConversionList(api.ConversionList o) {
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    checkUnnamed1445(o.conversion);
+    checkUnnamed1435(o.conversion);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionList--;
@@ -286,27 +285,27 @@
   buildCounterReportFiles--;
 }
 
-buildUnnamed1446() {
+buildUnnamed1436() {
   var o = new core.List<api.ReportFiles>();
   o.add(buildReportFiles());
   o.add(buildReportFiles());
   return o;
 }
 
-checkUnnamed1446(core.List<api.ReportFiles> o) {
+checkUnnamed1436(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportFiles(o[0]);
   checkReportFiles(o[1]);
 }
 
-buildUnnamed1447() {
+buildUnnamed1437() {
   var o = new core.List<api.ReportRow>();
   o.add(buildReportRow());
   o.add(buildReportRow());
   return o;
 }
 
-checkUnnamed1447(core.List<api.ReportRow> o) {
+checkUnnamed1437(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRow(o[0]);
   checkReportRow(o[1]);
@@ -317,13 +316,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.files = buildUnnamed1446();
+    o.files = buildUnnamed1436();
     o.id = "foo";
     o.isReportReady = true;
     o.kind = "foo";
     o.request = buildReportRequest();
     o.rowCount = 42;
-    o.rows = buildUnnamed1447();
+    o.rows = buildUnnamed1437();
     o.statisticsCurrencyCode = "foo";
     o.statisticsTimeZone = "foo";
   }
@@ -334,13 +333,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed1446(o.files);
+    checkUnnamed1436(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isReportReady, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkReportRequest(o.request);
     unittest.expect(o.rowCount, unittest.equals(42));
-    checkUnnamed1447(o.rows);
+    checkUnnamed1437(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.statisticsTimeZone, unittest.equals('foo'));
   }
@@ -384,30 +383,46 @@
   buildCounterReportApiColumnSpec--;
 }
 
-buildUnnamed1448() {
+buildUnnamed1438() {
   var o = new core.List<api.ReportApiColumnSpec>();
   o.add(buildReportApiColumnSpec());
   o.add(buildReportApiColumnSpec());
   return o;
 }
 
-checkUnnamed1448(core.List<api.ReportApiColumnSpec> o) {
+checkUnnamed1438(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportApiColumnSpec(o[0]);
   checkReportApiColumnSpec(o[1]);
 }
 
-buildUnnamed1449() {
+buildUnnamed1439() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed1449(core.List<core.Object> o) {
+checkUnnamed1439(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterReportRequestFilters = 0;
@@ -417,7 +432,7 @@
   if (buildCounterReportRequestFilters < 3) {
     o.column = buildReportApiColumnSpec();
     o.operator = "foo";
-    o.values = buildUnnamed1449();
+    o.values = buildUnnamed1439();
   }
   buildCounterReportRequestFilters--;
   return o;
@@ -428,19 +443,19 @@
   if (buildCounterReportRequestFilters < 3) {
     checkReportApiColumnSpec(o.column);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkUnnamed1449(o.values);
+    checkUnnamed1439(o.values);
   }
   buildCounterReportRequestFilters--;
 }
 
-buildUnnamed1450() {
+buildUnnamed1440() {
   var o = new core.List<api.ReportRequestFilters>();
   o.add(buildReportRequestFilters());
   o.add(buildReportRequestFilters());
   return o;
 }
 
-checkUnnamed1450(core.List<api.ReportRequestFilters> o) {
+checkUnnamed1440(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestFilters(o[0]);
   checkReportRequestFilters(o[1]);
@@ -467,14 +482,14 @@
   buildCounterReportRequestOrderBy--;
 }
 
-buildUnnamed1451() {
+buildUnnamed1441() {
   var o = new core.List<api.ReportRequestOrderBy>();
   o.add(buildReportRequestOrderBy());
   o.add(buildReportRequestOrderBy());
   return o;
 }
 
-checkUnnamed1451(core.List<api.ReportRequestOrderBy> o) {
+checkUnnamed1441(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestOrderBy(o[0]);
   checkReportRequestOrderBy(o[1]);
@@ -516,7 +531,8 @@
   var o = new api.ReportRequestTimeRange();
   buildCounterReportRequestTimeRange++;
   if (buildCounterReportRequestTimeRange < 3) {
-    o.changedAttributesSinceTimestamp = core.DateTime.parse("2002-02-27T14:01:02");
+    o.changedAttributesSinceTimestamp =
+        core.DateTime.parse("2002-02-27T14:01:02");
     o.changedMetricsSinceTimestamp = core.DateTime.parse("2002-02-27T14:01:02");
     o.endDate = "foo";
     o.startDate = "foo";
@@ -528,8 +544,10 @@
 checkReportRequestTimeRange(api.ReportRequestTimeRange o) {
   buildCounterReportRequestTimeRange++;
   if (buildCounterReportRequestTimeRange < 3) {
-    unittest.expect(o.changedAttributesSinceTimestamp, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.changedMetricsSinceTimestamp, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.changedAttributesSinceTimestamp,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.changedMetricsSinceTimestamp,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.endDate, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals('foo'));
   }
@@ -541,13 +559,13 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.columns = buildUnnamed1448();
+    o.columns = buildUnnamed1438();
     o.downloadFormat = "foo";
-    o.filters = buildUnnamed1450();
+    o.filters = buildUnnamed1440();
     o.includeDeletedEntities = true;
     o.includeRemovedEntities = true;
     o.maxRowsPerFile = 42;
-    o.orderBy = buildUnnamed1451();
+    o.orderBy = buildUnnamed1441();
     o.reportScope = buildReportRequestReportScope();
     o.reportType = "foo";
     o.rowCount = 42;
@@ -563,13 +581,13 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed1448(o.columns);
+    checkUnnamed1438(o.columns);
     unittest.expect(o.downloadFormat, unittest.equals('foo'));
-    checkUnnamed1450(o.filters);
+    checkUnnamed1440(o.filters);
     unittest.expect(o.includeDeletedEntities, unittest.isTrue);
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
-    checkUnnamed1451(o.orderBy);
+    checkUnnamed1441(o.orderBy);
     checkReportRequestReportScope(o.reportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
@@ -583,15 +601,31 @@
 
 buildReportRow() {
   var o = new api.ReportRow();
-  o["a"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["b"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["a"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["b"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
 checkReportRow(api.ReportRow o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["a"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["b"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["a"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["b"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterSavedColumn = 0;
@@ -617,14 +651,14 @@
   buildCounterSavedColumn--;
 }
 
-buildUnnamed1452() {
+buildUnnamed1442() {
   var o = new core.List<api.SavedColumn>();
   o.add(buildSavedColumn());
   o.add(buildSavedColumn());
   return o;
 }
 
-checkUnnamed1452(core.List<api.SavedColumn> o) {
+checkUnnamed1442(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedColumn(o[0]);
   checkSavedColumn(o[1]);
@@ -635,7 +669,7 @@
   var o = new api.SavedColumnList();
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    o.items = buildUnnamed1452();
+    o.items = buildUnnamed1442();
     o.kind = "foo";
   }
   buildCounterSavedColumnList--;
@@ -645,20 +679,20 @@
 checkSavedColumnList(api.SavedColumnList o) {
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    checkUnnamed1452(o.items);
+    checkUnnamed1442(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSavedColumnList--;
 }
 
-buildUnnamed1453() {
+buildUnnamed1443() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed1453(core.List<api.Availability> o) {
+checkUnnamed1443(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -669,7 +703,7 @@
   var o = new api.UpdateAvailabilityRequest();
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    o.availabilities = buildUnnamed1453();
+    o.availabilities = buildUnnamed1443();
   }
   buildCounterUpdateAvailabilityRequest--;
   return o;
@@ -678,19 +712,19 @@
 checkUpdateAvailabilityRequest(api.UpdateAvailabilityRequest o) {
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    checkUnnamed1453(o.availabilities);
+    checkUnnamed1443(o.availabilities);
   }
   buildCounterUpdateAvailabilityRequest--;
 }
 
-buildUnnamed1454() {
+buildUnnamed1444() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed1454(core.List<api.Availability> o) {
+checkUnnamed1444(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -701,7 +735,7 @@
   var o = new api.UpdateAvailabilityResponse();
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    o.availabilities = buildUnnamed1454();
+    o.availabilities = buildUnnamed1444();
   }
   buildCounterUpdateAvailabilityResponse--;
   return o;
@@ -710,12 +744,11 @@
 checkUpdateAvailabilityResponse(api.UpdateAvailabilityResponse o) {
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    checkUnnamed1454(o.availabilities);
+    checkUnnamed1444(o.availabilities);
   }
   buildCounterUpdateAvailabilityResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-Availability", () {
     unittest.test("to-json--from-json", () {
@@ -725,7 +758,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Conversion", () {
     unittest.test("to-json--from-json", () {
       var o = buildConversion();
@@ -734,7 +766,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConversionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildConversionList();
@@ -743,7 +774,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomDimension", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomDimension();
@@ -752,7 +782,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomMetric", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomMetric();
@@ -761,7 +790,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportFiles", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportFiles();
@@ -770,7 +798,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Report", () {
     unittest.test("to-json--from-json", () {
       var o = buildReport();
@@ -779,7 +806,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportApiColumnSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportApiColumnSpec();
@@ -788,7 +814,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequestFilters", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequestFilters();
@@ -797,7 +822,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequestOrderBy", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequestOrderBy();
@@ -806,7 +830,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequestReportScope", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequestReportScope();
@@ -815,7 +838,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequestTimeRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequestTimeRange();
@@ -824,7 +846,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequest();
@@ -833,7 +854,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRow", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRow();
@@ -842,7 +862,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SavedColumn", () {
     unittest.test("to-json--from-json", () {
       var o = buildSavedColumn();
@@ -851,7 +870,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SavedColumnList", () {
     unittest.test("to-json--from-json", () {
       var o = buildSavedColumnList();
@@ -860,7 +878,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateAvailabilityRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateAvailabilityRequest();
@@ -869,7 +886,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateAvailabilityResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateAvailabilityResponse();
@@ -878,12 +894,11 @@
     });
   });
 
-
   unittest.group("resource-ConversionResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ConversionResourceApi res = new api.DoubleclicksearchApi(mock).conversion;
+      api.ConversionResourceApi res =
+          new api.DoubleclicksearchApi(mock).conversion;
       var arg_agencyId = "foo";
       var arg_advertiserId = "foo";
       var arg_engineAccountId = "foo";
@@ -900,32 +915,41 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("agency/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("agency/"));
         pathOffset += 7;
         index = path.indexOf("/advertiser/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_agencyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/advertiser/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/advertiser/"));
         pathOffset += 12;
         index = path.indexOf("/engine/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_advertiserId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/engine/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/engine/"));
         pathOffset += 8;
         index = path.indexOf("/conversion", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_engineAccountId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/conversion"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/conversion"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -938,37 +962,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["endDate"].first), unittest.equals(arg_endDate));
-        unittest.expect(core.int.parse(queryMap["rowCount"].first), unittest.equals(arg_rowCount));
-        unittest.expect(core.int.parse(queryMap["startDate"].first), unittest.equals(arg_startDate));
-        unittest.expect(core.int.parse(queryMap["startRow"].first), unittest.equals(arg_startRow));
-        unittest.expect(queryMap["adGroupId"].first, unittest.equals(arg_adGroupId));
+        unittest.expect(core.int.parse(queryMap["endDate"].first),
+            unittest.equals(arg_endDate));
+        unittest.expect(core.int.parse(queryMap["rowCount"].first),
+            unittest.equals(arg_rowCount));
+        unittest.expect(core.int.parse(queryMap["startDate"].first),
+            unittest.equals(arg_startDate));
+        unittest.expect(core.int.parse(queryMap["startRow"].first),
+            unittest.equals(arg_startRow));
+        unittest.expect(
+            queryMap["adGroupId"].first, unittest.equals(arg_adGroupId));
         unittest.expect(queryMap["adId"].first, unittest.equals(arg_adId));
-        unittest.expect(queryMap["campaignId"].first, unittest.equals(arg_campaignId));
-        unittest.expect(queryMap["criterionId"].first, unittest.equals(arg_criterionId));
-
+        unittest.expect(
+            queryMap["campaignId"].first, unittest.equals(arg_campaignId));
+        unittest.expect(
+            queryMap["criterionId"].first, unittest.equals(arg_criterionId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildConversionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_agencyId, arg_advertiserId, arg_engineAccountId, arg_endDate, arg_rowCount, arg_startDate, arg_startRow, adGroupId: arg_adGroupId, adId: arg_adId, campaignId: arg_campaignId, criterionId: arg_criterionId).then(unittest.expectAsync1(((api.ConversionList response) {
+      res
+          .get(arg_agencyId, arg_advertiserId, arg_engineAccountId, arg_endDate,
+              arg_rowCount, arg_startDate, arg_startRow,
+              adGroupId: arg_adGroupId,
+              adId: arg_adId,
+              campaignId: arg_campaignId,
+              criterionId: arg_criterionId)
+          .then(unittest.expectAsync1(((api.ConversionList response) {
         checkConversionList(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ConversionResourceApi res = new api.DoubleclicksearchApi(mock).conversion;
+      api.ConversionResourceApi res =
+          new api.DoubleclicksearchApi(mock).conversion;
       var arg_request = buildConversionList();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.ConversionList.fromJson(json);
@@ -978,11 +1017,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("conversion"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("conversion"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -995,29 +1037,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildConversionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.ConversionList response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.ConversionList response) {
         checkConversionList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ConversionResourceApi res = new api.DoubleclicksearchApi(mock).conversion;
+      api.ConversionResourceApi res =
+          new api.DoubleclicksearchApi(mock).conversion;
       var arg_request = buildConversionList();
       var arg_advertiserId = "foo";
       var arg_agencyId = "foo";
@@ -1034,11 +1079,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("conversion"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("conversion"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -1051,36 +1099,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["advertiserId"].first, unittest.equals(arg_advertiserId));
-        unittest.expect(queryMap["agencyId"].first, unittest.equals(arg_agencyId));
-        unittest.expect(core.int.parse(queryMap["endDate"].first), unittest.equals(arg_endDate));
-        unittest.expect(queryMap["engineAccountId"].first, unittest.equals(arg_engineAccountId));
-        unittest.expect(core.int.parse(queryMap["rowCount"].first), unittest.equals(arg_rowCount));
-        unittest.expect(core.int.parse(queryMap["startDate"].first), unittest.equals(arg_startDate));
-        unittest.expect(core.int.parse(queryMap["startRow"].first), unittest.equals(arg_startRow));
-
+        unittest.expect(
+            queryMap["advertiserId"].first, unittest.equals(arg_advertiserId));
+        unittest.expect(
+            queryMap["agencyId"].first, unittest.equals(arg_agencyId));
+        unittest.expect(core.int.parse(queryMap["endDate"].first),
+            unittest.equals(arg_endDate));
+        unittest.expect(queryMap["engineAccountId"].first,
+            unittest.equals(arg_engineAccountId));
+        unittest.expect(core.int.parse(queryMap["rowCount"].first),
+            unittest.equals(arg_rowCount));
+        unittest.expect(core.int.parse(queryMap["startDate"].first),
+            unittest.equals(arg_startDate));
+        unittest.expect(core.int.parse(queryMap["startRow"].first),
+            unittest.equals(arg_startRow));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildConversionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_advertiserId, arg_agencyId, arg_endDate, arg_engineAccountId, arg_rowCount, arg_startDate, arg_startRow).then(unittest.expectAsync1(((api.ConversionList response) {
+      res
+          .patch(arg_request, arg_advertiserId, arg_agencyId, arg_endDate,
+              arg_engineAccountId, arg_rowCount, arg_startDate, arg_startRow)
+          .then(unittest.expectAsync1(((api.ConversionList response) {
         checkConversionList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ConversionResourceApi res = new api.DoubleclicksearchApi(mock).conversion;
+      api.ConversionResourceApi res =
+          new api.DoubleclicksearchApi(mock).conversion;
       var arg_request = buildConversionList();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.ConversionList.fromJson(json);
@@ -1090,11 +1149,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("conversion"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("conversion"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -1107,29 +1169,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildConversionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request).then(unittest.expectAsync1(((api.ConversionList response) {
+      res
+          .update(arg_request)
+          .then(unittest.expectAsync1(((api.ConversionList response) {
         checkConversionList(response);
       })));
     });
 
     unittest.test("method--updateAvailability", () {
-
       var mock = new HttpServerMock();
-      api.ConversionResourceApi res = new api.DoubleclicksearchApi(mock).conversion;
+      api.ConversionResourceApi res =
+          new api.DoubleclicksearchApi(mock).conversion;
       var arg_request = buildUpdateAvailabilityRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.UpdateAvailabilityRequest.fromJson(json);
@@ -1139,11 +1204,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 29), unittest.equals("conversion/updateAvailability"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 29),
+            unittest.equals("conversion/updateAvailability"));
         pathOffset += 29;
 
         var query = (req.url).query;
@@ -1156,31 +1224,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUpdateAvailabilityResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.updateAvailability(arg_request).then(unittest.expectAsync1(((api.UpdateAvailabilityResponse response) {
+      res.updateAvailability(arg_request).then(
+          unittest.expectAsync1(((api.UpdateAvailabilityResponse response) {
         checkUpdateAvailabilityResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReportsResourceApi", () {
     unittest.test("method--generate", () {
-
       var mock = new HttpServerMock();
       api.ReportsResourceApi res = new api.DoubleclicksearchApi(mock).reports;
       var arg_request_1 = buildReportRequest();
@@ -1192,11 +1259,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("reports/generate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("reports/generate"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -1209,27 +1279,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generate(arg_request_1).then(unittest.expectAsync1(((api.Report response) {
+      res
+          .generate(arg_request_1)
+          .then(unittest.expectAsync1(((api.Report response) {
         checkReport(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ReportsResourceApi res = new api.DoubleclicksearchApi(mock).reports;
       var arg_reportId = "foo";
@@ -1238,11 +1310,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("reports/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1258,16 +1333,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReport());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1290,18 +1366,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("reports/"));
         pathOffset += 8;
         index = path.indexOf("/files/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_reportId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/files/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1317,25 +1398,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getFile(arg_reportId, arg_reportFragment).then(unittest.expectAsync1((_) {}));
+      res
+          .getFile(arg_reportId, arg_reportFragment)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--request", () {
-
       var mock = new HttpServerMock();
       api.ReportsResourceApi res = new api.DoubleclicksearchApi(mock).reports;
       var arg_request_1 = buildReportRequest();
@@ -1347,11 +1430,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("reports"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1364,33 +1450,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.request(arg_request_1).then(unittest.expectAsync1(((api.Report response) {
+      res
+          .request(arg_request_1)
+          .then(unittest.expectAsync1(((api.Report response) {
         checkReport(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SavedColumnsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.SavedColumnsResourceApi res = new api.DoubleclicksearchApi(mock).savedColumns;
+      api.SavedColumnsResourceApi res =
+          new api.DoubleclicksearchApi(mock).savedColumns;
       var arg_agencyId = "foo";
       var arg_advertiserId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1398,25 +1485,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("doubleclicksearch/v2/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("agency/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("agency/"));
         pathOffset += 7;
         index = path.indexOf("/advertiser/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_agencyId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/advertiser/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/advertiser/"));
         pathOffset += 12;
         index = path.indexOf("/savedcolumns", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_advertiserId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/savedcolumns"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/savedcolumns"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1429,27 +1523,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSavedColumnList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_agencyId, arg_advertiserId).then(unittest.expectAsync1(((api.SavedColumnList response) {
+      res
+          .list(arg_agencyId, arg_advertiserId)
+          .then(unittest.expectAsync1(((api.SavedColumnList response) {
         checkSavedColumnList(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index 75b6278..f78371d 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.drive.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/drive/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed703() {
+buildUnnamed702() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed703(core.List<core.String> o) {
+checkUnnamed702(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -69,7 +68,7 @@
   var o = new api.AboutAdditionalRoleInfoRoleSets();
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    o.additionalRoles = buildUnnamed703();
+    o.additionalRoles = buildUnnamed702();
     o.primaryRole = "foo";
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
@@ -79,20 +78,20 @@
 checkAboutAdditionalRoleInfoRoleSets(api.AboutAdditionalRoleInfoRoleSets o) {
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    checkUnnamed703(o.additionalRoles);
+    checkUnnamed702(o.additionalRoles);
     unittest.expect(o.primaryRole, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
 }
 
-buildUnnamed704() {
+buildUnnamed703() {
   var o = new core.List<api.AboutAdditionalRoleInfoRoleSets>();
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   return o;
 }
 
-checkUnnamed704(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
+checkUnnamed703(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfoRoleSets(o[0]);
   checkAboutAdditionalRoleInfoRoleSets(o[1]);
@@ -103,7 +102,7 @@
   var o = new api.AboutAdditionalRoleInfo();
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    o.roleSets = buildUnnamed704();
+    o.roleSets = buildUnnamed703();
     o.type = "foo";
   }
   buildCounterAboutAdditionalRoleInfo--;
@@ -113,33 +112,33 @@
 checkAboutAdditionalRoleInfo(api.AboutAdditionalRoleInfo o) {
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    checkUnnamed704(o.roleSets);
+    checkUnnamed703(o.roleSets);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfo--;
 }
 
-buildUnnamed705() {
+buildUnnamed704() {
   var o = new core.List<api.AboutAdditionalRoleInfo>();
   o.add(buildAboutAdditionalRoleInfo());
   o.add(buildAboutAdditionalRoleInfo());
   return o;
 }
 
-checkUnnamed705(core.List<api.AboutAdditionalRoleInfo> o) {
+checkUnnamed704(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfo(o[0]);
   checkAboutAdditionalRoleInfo(o[1]);
 }
 
-buildUnnamed706() {
+buildUnnamed705() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed706(core.List<core.String> o) {
+checkUnnamed705(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -151,7 +150,7 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed706();
+    o.targets = buildUnnamed705();
   }
   buildCounterAboutExportFormats--;
   return o;
@@ -161,19 +160,19 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed706(o.targets);
+    checkUnnamed705(o.targets);
   }
   buildCounterAboutExportFormats--;
 }
 
-buildUnnamed707() {
+buildUnnamed706() {
   var o = new core.List<api.AboutExportFormats>();
   o.add(buildAboutExportFormats());
   o.add(buildAboutExportFormats());
   return o;
 }
 
-checkUnnamed707(core.List<api.AboutExportFormats> o) {
+checkUnnamed706(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutExportFormats(o[0]);
   checkAboutExportFormats(o[1]);
@@ -200,19 +199,32 @@
   buildCounterAboutFeatures--;
 }
 
-buildUnnamed708() {
+buildUnnamed707() {
   var o = new core.List<api.AboutFeatures>();
   o.add(buildAboutFeatures());
   o.add(buildAboutFeatures());
   return o;
 }
 
-checkUnnamed708(core.List<api.AboutFeatures> o) {
+checkUnnamed707(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutFeatures(o[0]);
   checkAboutFeatures(o[1]);
 }
 
+buildUnnamed708() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed708(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed709() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -226,26 +238,13 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed710() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed710(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterAboutImportFormats = 0;
 buildAboutImportFormats() {
   var o = new api.AboutImportFormats();
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed710();
+    o.targets = buildUnnamed709();
   }
   buildCounterAboutImportFormats--;
   return o;
@@ -255,19 +254,19 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed710(o.targets);
+    checkUnnamed709(o.targets);
   }
   buildCounterAboutImportFormats--;
 }
 
-buildUnnamed711() {
+buildUnnamed710() {
   var o = new core.List<api.AboutImportFormats>();
   o.add(buildAboutImportFormats());
   o.add(buildAboutImportFormats());
   return o;
 }
 
-checkUnnamed711(core.List<api.AboutImportFormats> o) {
+checkUnnamed710(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutImportFormats(o[0]);
   checkAboutImportFormats(o[1]);
@@ -294,14 +293,14 @@
   buildCounterAboutMaxUploadSizes--;
 }
 
-buildUnnamed712() {
+buildUnnamed711() {
   var o = new core.List<api.AboutMaxUploadSizes>();
   o.add(buildAboutMaxUploadSizes());
   o.add(buildAboutMaxUploadSizes());
   return o;
 }
 
-checkUnnamed712(core.List<api.AboutMaxUploadSizes> o) {
+checkUnnamed711(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutMaxUploadSizes(o[0]);
   checkAboutMaxUploadSizes(o[1]);
@@ -328,14 +327,14 @@
   buildCounterAboutQuotaBytesByService--;
 }
 
-buildUnnamed713() {
+buildUnnamed712() {
   var o = new core.List<api.AboutQuotaBytesByService>();
   o.add(buildAboutQuotaBytesByService());
   o.add(buildAboutQuotaBytesByService());
   return o;
 }
 
-checkUnnamed713(core.List<api.AboutQuotaBytesByService> o) {
+checkUnnamed712(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutQuotaBytesByService(o[0]);
   checkAboutQuotaBytesByService(o[1]);
@@ -364,14 +363,14 @@
   buildCounterAboutTeamDriveThemes--;
 }
 
-buildUnnamed714() {
+buildUnnamed713() {
   var o = new core.List<api.AboutTeamDriveThemes>();
   o.add(buildAboutTeamDriveThemes());
   o.add(buildAboutTeamDriveThemes());
   return o;
 }
 
-checkUnnamed714(core.List<api.AboutTeamDriveThemes> o) {
+checkUnnamed713(core.List<api.AboutTeamDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutTeamDriveThemes(o[0]);
   checkAboutTeamDriveThemes(o[1]);
@@ -382,21 +381,21 @@
   var o = new api.About();
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    o.additionalRoleInfo = buildUnnamed705();
+    o.additionalRoleInfo = buildUnnamed704();
     o.domainSharingPolicy = "foo";
     o.etag = "foo";
-    o.exportFormats = buildUnnamed707();
-    o.features = buildUnnamed708();
-    o.folderColorPalette = buildUnnamed709();
-    o.importFormats = buildUnnamed711();
+    o.exportFormats = buildUnnamed706();
+    o.features = buildUnnamed707();
+    o.folderColorPalette = buildUnnamed708();
+    o.importFormats = buildUnnamed710();
     o.isCurrentAppInstalled = true;
     o.kind = "foo";
     o.languageCode = "foo";
     o.largestChangeId = "foo";
-    o.maxUploadSizes = buildUnnamed712();
+    o.maxUploadSizes = buildUnnamed711();
     o.name = "foo";
     o.permissionId = "foo";
-    o.quotaBytesByService = buildUnnamed713();
+    o.quotaBytesByService = buildUnnamed712();
     o.quotaBytesTotal = "foo";
     o.quotaBytesUsed = "foo";
     o.quotaBytesUsedAggregate = "foo";
@@ -405,7 +404,7 @@
     o.remainingChangeIds = "foo";
     o.rootFolderId = "foo";
     o.selfLink = "foo";
-    o.teamDriveThemes = buildUnnamed714();
+    o.teamDriveThemes = buildUnnamed713();
     o.user = buildUser();
   }
   buildCounterAbout--;
@@ -415,21 +414,21 @@
 checkAbout(api.About o) {
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    checkUnnamed705(o.additionalRoleInfo);
+    checkUnnamed704(o.additionalRoleInfo);
     unittest.expect(o.domainSharingPolicy, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed707(o.exportFormats);
-    checkUnnamed708(o.features);
-    checkUnnamed709(o.folderColorPalette);
-    checkUnnamed711(o.importFormats);
+    checkUnnamed706(o.exportFormats);
+    checkUnnamed707(o.features);
+    checkUnnamed708(o.folderColorPalette);
+    checkUnnamed710(o.importFormats);
     unittest.expect(o.isCurrentAppInstalled, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
-    checkUnnamed712(o.maxUploadSizes);
+    checkUnnamed711(o.maxUploadSizes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUnnamed713(o.quotaBytesByService);
+    checkUnnamed712(o.quotaBytesByService);
     unittest.expect(o.quotaBytesTotal, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsedAggregate, unittest.equals('foo'));
@@ -438,7 +437,7 @@
     unittest.expect(o.remainingChangeIds, unittest.equals('foo'));
     unittest.expect(o.rootFolderId, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed714(o.teamDriveThemes);
+    checkUnnamed713(o.teamDriveThemes);
     checkUser(o.user);
   }
   buildCounterAbout--;
@@ -467,19 +466,32 @@
   buildCounterAppIcons--;
 }
 
-buildUnnamed715() {
+buildUnnamed714() {
   var o = new core.List<api.AppIcons>();
   o.add(buildAppIcons());
   o.add(buildAppIcons());
   return o;
 }
 
-checkUnnamed715(core.List<api.AppIcons> o) {
+checkUnnamed714(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppIcons(o[0]);
   checkAppIcons(o[1]);
 }
 
+buildUnnamed715() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed715(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed716() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -519,19 +531,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed719() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed719(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterApp = 0;
 buildApp() {
   var o = new api.App();
@@ -541,7 +540,7 @@
     o.createInFolderTemplate = "foo";
     o.createUrl = "foo";
     o.hasDriveWideScope = true;
-    o.icons = buildUnnamed715();
+    o.icons = buildUnnamed714();
     o.id = "foo";
     o.installed = true;
     o.kind = "foo";
@@ -549,12 +548,12 @@
     o.name = "foo";
     o.objectType = "foo";
     o.openUrlTemplate = "foo";
-    o.primaryFileExtensions = buildUnnamed716();
-    o.primaryMimeTypes = buildUnnamed717();
+    o.primaryFileExtensions = buildUnnamed715();
+    o.primaryMimeTypes = buildUnnamed716();
     o.productId = "foo";
     o.productUrl = "foo";
-    o.secondaryFileExtensions = buildUnnamed718();
-    o.secondaryMimeTypes = buildUnnamed719();
+    o.secondaryFileExtensions = buildUnnamed717();
+    o.secondaryMimeTypes = buildUnnamed718();
     o.shortDescription = "foo";
     o.supportsCreate = true;
     o.supportsImport = true;
@@ -573,7 +572,7 @@
     unittest.expect(o.createInFolderTemplate, unittest.equals('foo'));
     unittest.expect(o.createUrl, unittest.equals('foo'));
     unittest.expect(o.hasDriveWideScope, unittest.isTrue);
-    checkUnnamed715(o.icons);
+    checkUnnamed714(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.installed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -581,12 +580,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.openUrlTemplate, unittest.equals('foo'));
-    checkUnnamed716(o.primaryFileExtensions);
-    checkUnnamed717(o.primaryMimeTypes);
+    checkUnnamed715(o.primaryFileExtensions);
+    checkUnnamed716(o.primaryMimeTypes);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productUrl, unittest.equals('foo'));
-    checkUnnamed718(o.secondaryFileExtensions);
-    checkUnnamed719(o.secondaryMimeTypes);
+    checkUnnamed717(o.secondaryFileExtensions);
+    checkUnnamed718(o.secondaryMimeTypes);
     unittest.expect(o.shortDescription, unittest.equals('foo'));
     unittest.expect(o.supportsCreate, unittest.isTrue);
     unittest.expect(o.supportsImport, unittest.isTrue);
@@ -597,27 +596,27 @@
   buildCounterApp--;
 }
 
-buildUnnamed720() {
+buildUnnamed719() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed720(core.List<core.String> o) {
+checkUnnamed719(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed721() {
+buildUnnamed720() {
   var o = new core.List<api.App>();
   o.add(buildApp());
   o.add(buildApp());
   return o;
 }
 
-checkUnnamed721(core.List<api.App> o) {
+checkUnnamed720(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApp(o[0]);
   checkApp(o[1]);
@@ -628,9 +627,9 @@
   var o = new api.AppList();
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    o.defaultAppIds = buildUnnamed720();
+    o.defaultAppIds = buildUnnamed719();
     o.etag = "foo";
-    o.items = buildUnnamed721();
+    o.items = buildUnnamed720();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -641,9 +640,9 @@
 checkAppList(api.AppList o) {
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    checkUnnamed720(o.defaultAppIds);
+    checkUnnamed719(o.defaultAppIds);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed721(o.items);
+    checkUnnamed720(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -678,7 +677,8 @@
     unittest.expect(o.fileId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.modificationDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modificationDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkTeamDrive(o.teamDrive);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
@@ -687,14 +687,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed722() {
+buildUnnamed721() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed722(core.List<api.Change> o) {
+checkUnnamed721(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -706,7 +706,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed722();
+    o.items = buildUnnamed721();
     o.kind = "foo";
     o.largestChangeId = "foo";
     o.newStartPageToken = "foo";
@@ -722,7 +722,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed722(o.items);
+    checkUnnamed721(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
     unittest.expect(o.newStartPageToken, unittest.equals('foo'));
@@ -733,14 +733,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed723() {
+buildUnnamed722() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed723(core.Map<core.String, core.String> o) {
+checkUnnamed722(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -755,7 +755,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed723();
+    o.params = buildUnnamed722();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -773,7 +773,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed723(o.params);
+    checkUnnamed722(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -783,14 +783,14 @@
   buildCounterChannel--;
 }
 
-buildUnnamed724() {
+buildUnnamed723() {
   var o = new core.List<api.ChildReference>();
   o.add(buildChildReference());
   o.add(buildChildReference());
   return o;
 }
 
-checkUnnamed724(core.List<api.ChildReference> o) {
+checkUnnamed723(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildReference(o[0]);
   checkChildReference(o[1]);
@@ -802,7 +802,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed724();
+    o.items = buildUnnamed723();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -816,7 +816,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed724(o.items);
+    checkUnnamed723(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -871,14 +871,14 @@
   buildCounterCommentContext--;
 }
 
-buildUnnamed725() {
+buildUnnamed724() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed725(core.List<api.CommentReply> o) {
+checkUnnamed724(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -901,7 +901,7 @@
     o.htmlContent = "foo";
     o.kind = "foo";
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.replies = buildUnnamed725();
+    o.replies = buildUnnamed724();
     o.selfLink = "foo";
     o.status = "foo";
   }
@@ -917,28 +917,30 @@
     unittest.expect(o.commentId, unittest.equals('foo'));
     unittest.expect(o.content, unittest.equals('foo'));
     checkCommentContext(o.context);
-    unittest.expect(o.createdDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.fileId, unittest.equals('foo'));
     unittest.expect(o.fileTitle, unittest.equals('foo'));
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed725(o.replies);
+    unittest.expect(o.modifiedDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed724(o.replies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed726() {
+buildUnnamed725() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed726(core.List<api.Comment> o) {
+checkUnnamed725(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -949,7 +951,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed726();
+    o.items = buildUnnamed725();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -962,7 +964,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed726(o.items);
+    checkUnnamed725(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -995,25 +997,27 @@
   if (buildCounterCommentReply < 3) {
     checkUser(o.author);
     unittest.expect(o.content, unittest.equals('foo'));
-    unittest.expect(o.createdDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.replyId, unittest.equals('foo'));
     unittest.expect(o.verb, unittest.equals('foo'));
   }
   buildCounterCommentReply--;
 }
 
-buildUnnamed727() {
+buildUnnamed726() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed727(core.List<api.CommentReply> o) {
+checkUnnamed726(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -1024,7 +1028,7 @@
   var o = new api.CommentReplyList();
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    o.items = buildUnnamed727();
+    o.items = buildUnnamed726();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1037,7 +1041,7 @@
 checkCommentReplyList(api.CommentReplyList o) {
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    checkUnnamed727(o.items);
+    checkUnnamed726(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1097,14 +1101,14 @@
   buildCounterFileCapabilities--;
 }
 
-buildUnnamed728() {
+buildUnnamed727() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed728(core.Map<core.String, core.String> o) {
+checkUnnamed727(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1240,58 +1244,71 @@
   buildCounterFileLabels--;
 }
 
-buildUnnamed729() {
+buildUnnamed728() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed729(core.Map<core.String, core.String> o) {
+checkUnnamed728(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed730() {
+buildUnnamed729() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed730(core.List<core.String> o) {
+checkUnnamed729(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed731() {
+buildUnnamed730() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed731(core.List<api.User> o) {
+checkUnnamed730(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed732() {
+buildUnnamed731() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed732(core.List<api.ParentReference> o) {
+checkUnnamed731(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
 }
 
+buildUnnamed732() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed732(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed733() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
@@ -1394,7 +1411,7 @@
     o.embedLink = "foo";
     o.etag = "foo";
     o.explicitlyTrashed = true;
-    o.exportLinks = buildUnnamed728();
+    o.exportLinks = buildUnnamed727();
     o.fileExtension = "foo";
     o.fileSize = "foo";
     o.folderColorRgb = "foo";
@@ -1417,12 +1434,13 @@
     o.mimeType = "foo";
     o.modifiedByMeDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.openWithLinks = buildUnnamed729();
+    o.openWithLinks = buildUnnamed728();
     o.originalFilename = "foo";
     o.ownedByMe = true;
-    o.ownerNames = buildUnnamed730();
-    o.owners = buildUnnamed731();
-    o.parents = buildUnnamed732();
+    o.ownerNames = buildUnnamed729();
+    o.owners = buildUnnamed730();
+    o.parents = buildUnnamed731();
+    o.permissionIds = buildUnnamed732();
     o.permissions = buildUnnamed733();
     o.properties = buildUnnamed734();
     o.quotaBytesUsed = "foo";
@@ -1459,7 +1477,8 @@
     unittest.expect(o.canReadRevisions, unittest.isTrue);
     checkFileCapabilities(o.capabilities);
     unittest.expect(o.copyable, unittest.isTrue);
-    unittest.expect(o.createdDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.defaultOpenWithLink, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
@@ -1467,7 +1486,7 @@
     unittest.expect(o.embedLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
-    checkUnnamed728(o.exportLinks);
+    checkUnnamed727(o.exportLinks);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.folderColorRgb, unittest.equals('foo'));
@@ -1484,25 +1503,31 @@
     checkFileLabels(o.labels);
     checkUser(o.lastModifyingUser);
     unittest.expect(o.lastModifyingUserName, unittest.equals('foo'));
-    unittest.expect(o.lastViewedByMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.markedViewedByMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastViewedByMeDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.markedViewedByMeDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
-    unittest.expect(o.modifiedByMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed729(o.openWithLinks);
+    unittest.expect(o.modifiedByMeDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed728(o.openWithLinks);
     unittest.expect(o.originalFilename, unittest.equals('foo'));
     unittest.expect(o.ownedByMe, unittest.isTrue);
-    checkUnnamed730(o.ownerNames);
-    checkUnnamed731(o.owners);
-    checkUnnamed732(o.parents);
+    checkUnnamed729(o.ownerNames);
+    checkUnnamed730(o.owners);
+    checkUnnamed731(o.parents);
+    checkUnnamed732(o.permissionIds);
     checkUnnamed733(o.permissions);
     checkUnnamed734(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.shareable, unittest.isTrue);
     unittest.expect(o.shared, unittest.isTrue);
-    unittest.expect(o.sharedWithMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.sharedWithMeDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUser(o.sharingUser);
     checkUnnamed735(o.spaces);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
@@ -1510,7 +1535,8 @@
     unittest.expect(o.thumbnailLink, unittest.equals('foo'));
     unittest.expect(o.thumbnailVersion, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.trashedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.trashedDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUser(o.trashingUser);
     checkPermission(o.userPermission);
     unittest.expect(o.version, unittest.equals('foo'));
@@ -1708,7 +1734,8 @@
   return o;
 }
 
-checkPermissionTeamDrivePermissionDetails(api.PermissionTeamDrivePermissionDetails o) {
+checkPermissionTeamDrivePermissionDetails(
+    api.PermissionTeamDrivePermissionDetails o) {
   buildCounterPermissionTeamDrivePermissionDetails++;
   if (buildCounterPermissionTeamDrivePermissionDetails < 3) {
     checkUnnamed740(o.additionalRoles);
@@ -1769,7 +1796,8 @@
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    unittest.expect(o.expirationDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.expirationDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1966,7 +1994,8 @@
     unittest.expect(o.lastModifyingUserName, unittest.equals('foo'));
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
-    unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.originalFilename, unittest.equals('foo'));
     unittest.expect(o.pinned, unittest.isTrue);
     unittest.expect(o.publishAuto, unittest.isTrue);
@@ -2226,7 +2255,6 @@
   buildCounterUser--;
 }
 
-
 main() {
   unittest.group("obj-schema-AboutAdditionalRoleInfoRoleSets", () {
     unittest.test("to-json--from-json", () {
@@ -2236,7 +2264,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutAdditionalRoleInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutAdditionalRoleInfo();
@@ -2245,7 +2272,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutExportFormats", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutExportFormats();
@@ -2254,7 +2280,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutFeatures", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutFeatures();
@@ -2263,7 +2288,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutImportFormats", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutImportFormats();
@@ -2272,7 +2296,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutMaxUploadSizes", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutMaxUploadSizes();
@@ -2281,7 +2304,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutQuotaBytesByService", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutQuotaBytesByService();
@@ -2290,7 +2312,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutTeamDriveThemes", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutTeamDriveThemes();
@@ -2299,7 +2320,6 @@
     });
   });
 
-
   unittest.group("obj-schema-About", () {
     unittest.test("to-json--from-json", () {
       var o = buildAbout();
@@ -2308,7 +2328,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppIcons", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppIcons();
@@ -2317,7 +2336,6 @@
     });
   });
 
-
   unittest.group("obj-schema-App", () {
     unittest.test("to-json--from-json", () {
       var o = buildApp();
@@ -2326,7 +2344,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AppList", () {
     unittest.test("to-json--from-json", () {
       var o = buildAppList();
@@ -2335,7 +2352,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Change", () {
     unittest.test("to-json--from-json", () {
       var o = buildChange();
@@ -2344,7 +2360,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChangeList", () {
     unittest.test("to-json--from-json", () {
       var o = buildChangeList();
@@ -2353,7 +2368,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Channel", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannel();
@@ -2362,7 +2376,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChildList", () {
     unittest.test("to-json--from-json", () {
       var o = buildChildList();
@@ -2371,7 +2384,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChildReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildChildReference();
@@ -2380,7 +2392,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentContext();
@@ -2389,7 +2400,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Comment", () {
     unittest.test("to-json--from-json", () {
       var o = buildComment();
@@ -2398,7 +2408,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentList", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentList();
@@ -2407,7 +2416,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentReply", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentReply();
@@ -2416,7 +2424,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentReplyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentReplyList();
@@ -2425,7 +2432,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileCapabilities", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileCapabilities();
@@ -2434,7 +2440,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileImageMediaMetadataLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileImageMediaMetadataLocation();
@@ -2443,7 +2448,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileImageMediaMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileImageMediaMetadata();
@@ -2452,7 +2456,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileIndexableText", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileIndexableText();
@@ -2461,7 +2464,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileLabels", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileLabels();
@@ -2470,7 +2472,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileThumbnail", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileThumbnail();
@@ -2479,7 +2480,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileVideoMediaMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileVideoMediaMetadata();
@@ -2488,7 +2488,6 @@
     });
   });
 
-
   unittest.group("obj-schema-File", () {
     unittest.test("to-json--from-json", () {
       var o = buildFile();
@@ -2497,7 +2496,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileList", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileList();
@@ -2506,7 +2504,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GeneratedIds", () {
     unittest.test("to-json--from-json", () {
       var o = buildGeneratedIds();
@@ -2515,7 +2512,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ParentList", () {
     unittest.test("to-json--from-json", () {
       var o = buildParentList();
@@ -2524,7 +2520,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ParentReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildParentReference();
@@ -2533,16 +2528,15 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionTeamDrivePermissionDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionTeamDrivePermissionDetails();
-      var od = new api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
+      var od =
+          new api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
       checkPermissionTeamDrivePermissionDetails(od);
     });
   });
 
-
   unittest.group("obj-schema-Permission", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermission();
@@ -2551,7 +2545,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionId", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionId();
@@ -2560,7 +2553,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionList();
@@ -2569,7 +2561,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Property", () {
     unittest.test("to-json--from-json", () {
       var o = buildProperty();
@@ -2578,7 +2569,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PropertyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildPropertyList();
@@ -2587,7 +2577,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Revision", () {
     unittest.test("to-json--from-json", () {
       var o = buildRevision();
@@ -2596,7 +2585,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RevisionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRevisionList();
@@ -2605,7 +2593,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StartPageToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildStartPageToken();
@@ -2614,7 +2601,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDriveBackgroundImageFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDriveBackgroundImageFile();
@@ -2623,7 +2609,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDriveCapabilities", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDriveCapabilities();
@@ -2632,7 +2617,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDrive", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDrive();
@@ -2641,7 +2625,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDriveList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDriveList();
@@ -2650,7 +2633,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserPicture", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserPicture();
@@ -2659,7 +2641,6 @@
     });
   });
 
-
   unittest.group("obj-schema-User", () {
     unittest.test("to-json--from-json", () {
       var o = buildUser();
@@ -2668,10 +2649,8 @@
     });
   });
 
-
   unittest.group("resource-AboutResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AboutResourceApi res = new api.DriveApi(mock).about;
       var arg_includeSubscribed = true;
@@ -2682,11 +2661,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("about"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("about"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -2699,34 +2681,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeSubscribed"].first, unittest.equals("$arg_includeSubscribed"));
-        unittest.expect(queryMap["maxChangeIdCount"].first, unittest.equals(arg_maxChangeIdCount));
-        unittest.expect(queryMap["startChangeId"].first, unittest.equals(arg_startChangeId));
-
+        unittest.expect(queryMap["includeSubscribed"].first,
+            unittest.equals("$arg_includeSubscribed"));
+        unittest.expect(queryMap["maxChangeIdCount"].first,
+            unittest.equals(arg_maxChangeIdCount));
+        unittest.expect(queryMap["startChangeId"].first,
+            unittest.equals(arg_startChangeId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAbout());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(includeSubscribed: arg_includeSubscribed, maxChangeIdCount: arg_maxChangeIdCount, startChangeId: arg_startChangeId).then(unittest.expectAsync1(((api.About response) {
+      res
+          .get(
+              includeSubscribed: arg_includeSubscribed,
+              maxChangeIdCount: arg_maxChangeIdCount,
+              startChangeId: arg_startChangeId)
+          .then(unittest.expectAsync1(((api.About response) {
         checkAbout(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AppsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AppsResourceApi res = new api.DriveApi(mock).apps;
       var arg_appId = "foo";
@@ -2735,11 +2723,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("apps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("apps/"));
         pathOffset += 5;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2755,16 +2746,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApp());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2775,7 +2767,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.AppsResourceApi res = new api.DriveApi(mock).apps;
       var arg_appFilterExtensions = "foo";
@@ -2786,11 +2777,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals("apps"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 4),
+            unittest.equals("apps"));
         pathOffset += 4;
 
         var query = (req.url).query;
@@ -2803,34 +2797,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["appFilterExtensions"].first, unittest.equals(arg_appFilterExtensions));
-        unittest.expect(queryMap["appFilterMimeTypes"].first, unittest.equals(arg_appFilterMimeTypes));
-        unittest.expect(queryMap["languageCode"].first, unittest.equals(arg_languageCode));
-
+        unittest.expect(queryMap["appFilterExtensions"].first,
+            unittest.equals(arg_appFilterExtensions));
+        unittest.expect(queryMap["appFilterMimeTypes"].first,
+            unittest.equals(arg_appFilterMimeTypes));
+        unittest.expect(
+            queryMap["languageCode"].first, unittest.equals(arg_languageCode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAppList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(appFilterExtensions: arg_appFilterExtensions, appFilterMimeTypes: arg_appFilterMimeTypes, languageCode: arg_languageCode).then(unittest.expectAsync1(((api.AppList response) {
+      res
+          .list(
+              appFilterExtensions: arg_appFilterExtensions,
+              appFilterMimeTypes: arg_appFilterMimeTypes,
+              languageCode: arg_languageCode)
+          .then(unittest.expectAsync1(((api.AppList response) {
         checkAppList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChangesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_changeId = "foo";
@@ -2841,11 +2841,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("changes/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("changes/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2861,29 +2864,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChange());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_changeId, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.Change response) {
+      res
+          .get(arg_changeId,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.Change response) {
         checkChange(response);
       })));
     });
 
     unittest.test("method--getStartPageToken", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_supportsTeamDrives = true;
@@ -2893,11 +2902,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("changes/startPageToken"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("changes/startPageToken"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -2910,29 +2922,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStartPageToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getStartPageToken(supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.StartPageToken response) {
+      res
+          .getStartPageToken(
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.StartPageToken response) {
         checkStartPageToken(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_includeCorpusRemovals = true;
@@ -2950,11 +2968,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("changes"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("changes"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2967,37 +2988,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeCorpusRemovals"].first, unittest.equals("$arg_includeCorpusRemovals"));
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(queryMap["includeSubscribed"].first, unittest.equals("$arg_includeSubscribed"));
-        unittest.expect(queryMap["includeTeamDriveItems"].first, unittest.equals("$arg_includeTeamDriveItems"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["includeCorpusRemovals"].first,
+            unittest.equals("$arg_includeCorpusRemovals"));
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(queryMap["includeSubscribed"].first,
+            unittest.equals("$arg_includeSubscribed"));
+        unittest.expect(queryMap["includeTeamDriveItems"].first,
+            unittest.equals("$arg_includeTeamDriveItems"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["spaces"].first, unittest.equals(arg_spaces));
-        unittest.expect(queryMap["startChangeId"].first, unittest.equals(arg_startChangeId));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["startChangeId"].first,
+            unittest.equals(arg_startChangeId));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChangeList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(includeCorpusRemovals: arg_includeCorpusRemovals, includeDeleted: arg_includeDeleted, includeSubscribed: arg_includeSubscribed, includeTeamDriveItems: arg_includeTeamDriveItems, maxResults: arg_maxResults, pageToken: arg_pageToken, spaces: arg_spaces, startChangeId: arg_startChangeId, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.ChangeList response) {
+      res
+          .list(
+              includeCorpusRemovals: arg_includeCorpusRemovals,
+              includeDeleted: arg_includeDeleted,
+              includeSubscribed: arg_includeSubscribed,
+              includeTeamDriveItems: arg_includeTeamDriveItems,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              spaces: arg_spaces,
+              startChangeId: arg_startChangeId,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.ChangeList response) {
         checkChangeList(response);
       })));
     });
 
     unittest.test("method--watch", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_request = buildChannel();
@@ -3019,11 +3061,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("changes/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("changes/watch"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -3036,41 +3081,60 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeCorpusRemovals"].first, unittest.equals("$arg_includeCorpusRemovals"));
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(queryMap["includeSubscribed"].first, unittest.equals("$arg_includeSubscribed"));
-        unittest.expect(queryMap["includeTeamDriveItems"].first, unittest.equals("$arg_includeTeamDriveItems"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["includeCorpusRemovals"].first,
+            unittest.equals("$arg_includeCorpusRemovals"));
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(queryMap["includeSubscribed"].first,
+            unittest.equals("$arg_includeSubscribed"));
+        unittest.expect(queryMap["includeTeamDriveItems"].first,
+            unittest.equals("$arg_includeTeamDriveItems"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["spaces"].first, unittest.equals(arg_spaces));
-        unittest.expect(queryMap["startChangeId"].first, unittest.equals(arg_startChangeId));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["startChangeId"].first,
+            unittest.equals(arg_startChangeId));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, includeCorpusRemovals: arg_includeCorpusRemovals, includeDeleted: arg_includeDeleted, includeSubscribed: arg_includeSubscribed, includeTeamDriveItems: arg_includeTeamDriveItems, maxResults: arg_maxResults, pageToken: arg_pageToken, spaces: arg_spaces, startChangeId: arg_startChangeId, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request,
+              includeCorpusRemovals: arg_includeCorpusRemovals,
+              includeDeleted: arg_includeDeleted,
+              includeSubscribed: arg_includeSubscribed,
+              includeTeamDriveItems: arg_includeTeamDriveItems,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              spaces: arg_spaces,
+              startChangeId: arg_startChangeId,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelsResourceApi", () {
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.ChannelsResourceApi res = new api.DriveApi(mock).channels;
       var arg_request = buildChannel();
@@ -3082,11 +3146,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("channels/stop"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("channels/stop"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -3099,29 +3166,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.stop(arg_request).then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-ChildrenResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ChildrenResourceApi res = new api.DriveApi(mock).children;
       var arg_folderId = "foo";
@@ -3131,18 +3196,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_folderId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/children/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/children/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3158,16 +3228,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3176,7 +3247,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ChildrenResourceApi res = new api.DriveApi(mock).children;
       var arg_folderId = "foo";
@@ -3186,18 +3256,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_folderId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/children/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/children/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3213,27 +3288,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChildReference());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_folderId, arg_childId).then(unittest.expectAsync1(((api.ChildReference response) {
+      res
+          .get(arg_folderId, arg_childId)
+          .then(unittest.expectAsync1(((api.ChildReference response) {
         checkChildReference(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ChildrenResourceApi res = new api.DriveApi(mock).children;
       var arg_request = buildChildReference();
@@ -3247,18 +3324,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_folderId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/children"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/children"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3271,28 +3353,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChildReference());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_folderId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.ChildReference response) {
+      res
+          .insert(arg_request, arg_folderId,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.ChildReference response) {
         checkChildReference(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ChildrenResourceApi res = new api.DriveApi(mock).children;
       var arg_folderId = "foo";
@@ -3305,18 +3391,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_folderId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/children"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/children"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3329,35 +3420,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["q"].first, unittest.equals(arg_q));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChildList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_folderId, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, q: arg_q).then(unittest.expectAsync1(((api.ChildList response) {
+      res
+          .list(arg_folderId,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken,
+              q: arg_q)
+          .then(unittest.expectAsync1(((api.ChildList response) {
         checkChildList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CommentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_fileId = "foo";
@@ -3367,18 +3465,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3394,16 +3497,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3412,7 +3516,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_fileId = "foo";
@@ -3423,18 +3526,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3450,28 +3558,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_commentId, includeDeleted: arg_includeDeleted).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .get(arg_fileId, arg_commentId, includeDeleted: arg_includeDeleted)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_request = buildComment();
@@ -3484,18 +3595,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/comments"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3508,27 +3624,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_fileId).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .insert(arg_request, arg_fileId)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_fileId = "foo";
@@ -3541,18 +3659,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/comments"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -3565,31 +3688,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["updatedMin"].first, unittest.equals(arg_updatedMin));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["updatedMin"].first, unittest.equals(arg_updatedMin));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, includeDeleted: arg_includeDeleted, maxResults: arg_maxResults, pageToken: arg_pageToken, updatedMin: arg_updatedMin).then(unittest.expectAsync1(((api.CommentList response) {
+      res
+          .list(arg_fileId,
+              includeDeleted: arg_includeDeleted,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              updatedMin: arg_updatedMin)
+          .then(unittest.expectAsync1(((api.CommentList response) {
         checkCommentList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_request = buildComment();
@@ -3603,18 +3736,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3630,27 +3768,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_fileId, arg_commentId).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .patch(arg_request, arg_fileId, arg_commentId)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_request = buildComment();
@@ -3664,18 +3804,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3691,31 +3836,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_commentId).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .update(arg_request, arg_fileId, arg_commentId)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-FilesResourceApi", () {
     unittest.test("method--copy", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_request = buildFile();
@@ -3736,18 +3881,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/copy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/copy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/copy"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -3760,35 +3910,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["convert"].first, unittest.equals("$arg_convert"));
+        unittest.expect(
+            queryMap["convert"].first, unittest.equals("$arg_convert"));
         unittest.expect(queryMap["ocr"].first, unittest.equals("$arg_ocr"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["pinned"].first, unittest.equals("$arg_pinned"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["timedTextLanguage"].first, unittest.equals(arg_timedTextLanguage));
-        unittest.expect(queryMap["timedTextTrackName"].first, unittest.equals(arg_timedTextTrackName));
-        unittest.expect(queryMap["visibility"].first, unittest.equals(arg_visibility));
-
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(
+            queryMap["pinned"].first, unittest.equals("$arg_pinned"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["timedTextLanguage"].first,
+            unittest.equals(arg_timedTextLanguage));
+        unittest.expect(queryMap["timedTextTrackName"].first,
+            unittest.equals(arg_timedTextTrackName));
+        unittest.expect(
+            queryMap["visibility"].first, unittest.equals(arg_visibility));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.copy(arg_request, arg_fileId, convert: arg_convert, ocr: arg_ocr, ocrLanguage: arg_ocrLanguage, pinned: arg_pinned, supportsTeamDrives: arg_supportsTeamDrives, timedTextLanguage: arg_timedTextLanguage, timedTextTrackName: arg_timedTextTrackName, visibility: arg_visibility).then(unittest.expectAsync1(((api.File response) {
+      res
+          .copy(arg_request, arg_fileId,
+              convert: arg_convert,
+              ocr: arg_ocr,
+              ocrLanguage: arg_ocrLanguage,
+              pinned: arg_pinned,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              timedTextLanguage: arg_timedTextLanguage,
+              timedTextTrackName: arg_timedTextTrackName,
+              visibility: arg_visibility)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_fileId = "foo";
@@ -3798,11 +3965,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3818,26 +3988,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--emptyTrash", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3845,11 +4018,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("files/trash"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("files/trash"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -3862,16 +4038,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3892,18 +4069,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/export", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/export"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/export"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -3916,17 +4098,19 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["mimeType"].first, unittest.equals(arg_mimeType));
-
+        unittest.expect(
+            queryMap["mimeType"].first, unittest.equals(arg_mimeType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3935,7 +4119,6 @@
     });
 
     unittest.test("method--generateIds", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_maxResults = 42;
@@ -3945,11 +4128,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("files/generateIds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("files/generateIds"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -3962,23 +4148,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["space"].first, unittest.equals(arg_space));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGeneratedIds());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateIds(maxResults: arg_maxResults, space: arg_space).then(unittest.expectAsync1(((api.GeneratedIds response) {
+      res
+          .generateIds(maxResults: arg_maxResults, space: arg_space)
+          .then(unittest.expectAsync1(((api.GeneratedIds response) {
         checkGeneratedIds(response);
       })));
     });
@@ -4000,11 +4190,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4020,26 +4213,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["acknowledgeAbuse"].first, unittest.equals("$arg_acknowledgeAbuse"));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-        unittest.expect(queryMap["revisionId"].first, unittest.equals(arg_revisionId));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["updateViewedDate"].first, unittest.equals("$arg_updateViewedDate"));
-
+        unittest.expect(queryMap["acknowledgeAbuse"].first,
+            unittest.equals("$arg_acknowledgeAbuse"));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(
+            queryMap["revisionId"].first, unittest.equals(arg_revisionId));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["updateViewedDate"].first,
+            unittest.equals("$arg_updateViewedDate"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, acknowledgeAbuse: arg_acknowledgeAbuse, projection: arg_projection, revisionId: arg_revisionId, supportsTeamDrives: arg_supportsTeamDrives, updateViewedDate: arg_updateViewedDate).then(unittest.expectAsync1(((api.File response) {
+      res
+          .get(arg_fileId,
+              acknowledgeAbuse: arg_acknowledgeAbuse,
+              projection: arg_projection,
+              revisionId: arg_revisionId,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              updateViewedDate: arg_updateViewedDate)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
@@ -4068,11 +4274,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("files"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("files"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -4085,36 +4294,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["convert"].first, unittest.equals("$arg_convert"));
+        unittest.expect(
+            queryMap["convert"].first, unittest.equals("$arg_convert"));
         unittest.expect(queryMap["ocr"].first, unittest.equals("$arg_ocr"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["pinned"].first, unittest.equals("$arg_pinned"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["timedTextLanguage"].first, unittest.equals(arg_timedTextLanguage));
-        unittest.expect(queryMap["timedTextTrackName"].first, unittest.equals(arg_timedTextTrackName));
-        unittest.expect(queryMap["useContentAsIndexableText"].first, unittest.equals("$arg_useContentAsIndexableText"));
-        unittest.expect(queryMap["visibility"].first, unittest.equals(arg_visibility));
-
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(
+            queryMap["pinned"].first, unittest.equals("$arg_pinned"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["timedTextLanguage"].first,
+            unittest.equals(arg_timedTextLanguage));
+        unittest.expect(queryMap["timedTextTrackName"].first,
+            unittest.equals(arg_timedTextTrackName));
+        unittest.expect(queryMap["useContentAsIndexableText"].first,
+            unittest.equals("$arg_useContentAsIndexableText"));
+        unittest.expect(
+            queryMap["visibility"].first, unittest.equals(arg_visibility));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, convert: arg_convert, ocr: arg_ocr, ocrLanguage: arg_ocrLanguage, pinned: arg_pinned, supportsTeamDrives: arg_supportsTeamDrives, timedTextLanguage: arg_timedTextLanguage, timedTextTrackName: arg_timedTextTrackName, useContentAsIndexableText: arg_useContentAsIndexableText, visibility: arg_visibility).then(unittest.expectAsync1(((api.File response) {
+      res
+          .insert(arg_request,
+              convert: arg_convert,
+              ocr: arg_ocr,
+              ocrLanguage: arg_ocrLanguage,
+              pinned: arg_pinned,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              timedTextLanguage: arg_timedTextLanguage,
+              timedTextTrackName: arg_timedTextTrackName,
+              useContentAsIndexableText: arg_useContentAsIndexableText,
+              visibility: arg_visibility)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_corpora = "foo";
@@ -4133,11 +4361,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("files"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("files"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -4150,38 +4381,59 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["corpora"].first, unittest.equals(arg_corpora));
+        unittest.expect(
+            queryMap["corpora"].first, unittest.equals(arg_corpora));
         unittest.expect(queryMap["corpus"].first, unittest.equals(arg_corpus));
-        unittest.expect(queryMap["includeTeamDriveItems"].first, unittest.equals("$arg_includeTeamDriveItems"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(queryMap["includeTeamDriveItems"].first,
+            unittest.equals("$arg_includeTeamDriveItems"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["q"].first, unittest.equals(arg_q));
         unittest.expect(queryMap["spaces"].first, unittest.equals(arg_spaces));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFileList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(corpora: arg_corpora, corpus: arg_corpus, includeTeamDriveItems: arg_includeTeamDriveItems, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, projection: arg_projection, q: arg_q, spaces: arg_spaces, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.FileList response) {
+      res
+          .list(
+              corpora: arg_corpora,
+              corpus: arg_corpus,
+              includeTeamDriveItems: arg_includeTeamDriveItems,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken,
+              projection: arg_projection,
+              q: arg_q,
+              spaces: arg_spaces,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.FileList response) {
         checkFileList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_request = buildFile();
@@ -4208,11 +4460,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4228,41 +4483,70 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["addParents"].first, unittest.equals(arg_addParents));
-        unittest.expect(queryMap["convert"].first, unittest.equals("$arg_convert"));
-        unittest.expect(queryMap["modifiedDateBehavior"].first, unittest.equals(arg_modifiedDateBehavior));
-        unittest.expect(queryMap["newRevision"].first, unittest.equals("$arg_newRevision"));
+        unittest.expect(
+            queryMap["addParents"].first, unittest.equals(arg_addParents));
+        unittest.expect(
+            queryMap["convert"].first, unittest.equals("$arg_convert"));
+        unittest.expect(queryMap["modifiedDateBehavior"].first,
+            unittest.equals(arg_modifiedDateBehavior));
+        unittest.expect(
+            queryMap["newRevision"].first, unittest.equals("$arg_newRevision"));
         unittest.expect(queryMap["ocr"].first, unittest.equals("$arg_ocr"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["pinned"].first, unittest.equals("$arg_pinned"));
-        unittest.expect(queryMap["removeParents"].first, unittest.equals(arg_removeParents));
-        unittest.expect(queryMap["setModifiedDate"].first, unittest.equals("$arg_setModifiedDate"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["timedTextLanguage"].first, unittest.equals(arg_timedTextLanguage));
-        unittest.expect(queryMap["timedTextTrackName"].first, unittest.equals(arg_timedTextTrackName));
-        unittest.expect(queryMap["updateViewedDate"].first, unittest.equals("$arg_updateViewedDate"));
-        unittest.expect(queryMap["useContentAsIndexableText"].first, unittest.equals("$arg_useContentAsIndexableText"));
-
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(
+            queryMap["pinned"].first, unittest.equals("$arg_pinned"));
+        unittest.expect(queryMap["removeParents"].first,
+            unittest.equals(arg_removeParents));
+        unittest.expect(queryMap["setModifiedDate"].first,
+            unittest.equals("$arg_setModifiedDate"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["timedTextLanguage"].first,
+            unittest.equals(arg_timedTextLanguage));
+        unittest.expect(queryMap["timedTextTrackName"].first,
+            unittest.equals(arg_timedTextTrackName));
+        unittest.expect(queryMap["updateViewedDate"].first,
+            unittest.equals("$arg_updateViewedDate"));
+        unittest.expect(queryMap["useContentAsIndexableText"].first,
+            unittest.equals("$arg_useContentAsIndexableText"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_fileId, addParents: arg_addParents, convert: arg_convert, modifiedDateBehavior: arg_modifiedDateBehavior, newRevision: arg_newRevision, ocr: arg_ocr, ocrLanguage: arg_ocrLanguage, pinned: arg_pinned, removeParents: arg_removeParents, setModifiedDate: arg_setModifiedDate, supportsTeamDrives: arg_supportsTeamDrives, timedTextLanguage: arg_timedTextLanguage, timedTextTrackName: arg_timedTextTrackName, updateViewedDate: arg_updateViewedDate, useContentAsIndexableText: arg_useContentAsIndexableText).then(unittest.expectAsync1(((api.File response) {
+      res
+          .patch(arg_request, arg_fileId,
+              addParents: arg_addParents,
+              convert: arg_convert,
+              modifiedDateBehavior: arg_modifiedDateBehavior,
+              newRevision: arg_newRevision,
+              ocr: arg_ocr,
+              ocrLanguage: arg_ocrLanguage,
+              pinned: arg_pinned,
+              removeParents: arg_removeParents,
+              setModifiedDate: arg_setModifiedDate,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              timedTextLanguage: arg_timedTextLanguage,
+              timedTextTrackName: arg_timedTextTrackName,
+              updateViewedDate: arg_updateViewedDate,
+              useContentAsIndexableText: arg_useContentAsIndexableText)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--touch", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_fileId = "foo";
@@ -4272,18 +4556,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/touch", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/touch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/touch"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4296,28 +4585,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.touch(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.File response) {
+      res
+          .touch(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--trash", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_fileId = "foo";
@@ -4327,18 +4619,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/trash", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/trash"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/trash"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4351,28 +4648,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.trash(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.File response) {
+      res
+          .trash(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--untrash", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_fileId = "foo";
@@ -4382,18 +4682,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/untrash", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/untrash"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/untrash"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4406,22 +4711,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.untrash(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.File response) {
+      res
+          .untrash(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
@@ -4456,11 +4765,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4476,35 +4788,65 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["addParents"].first, unittest.equals(arg_addParents));
-        unittest.expect(queryMap["convert"].first, unittest.equals("$arg_convert"));
-        unittest.expect(queryMap["modifiedDateBehavior"].first, unittest.equals(arg_modifiedDateBehavior));
-        unittest.expect(queryMap["newRevision"].first, unittest.equals("$arg_newRevision"));
+        unittest.expect(
+            queryMap["addParents"].first, unittest.equals(arg_addParents));
+        unittest.expect(
+            queryMap["convert"].first, unittest.equals("$arg_convert"));
+        unittest.expect(queryMap["modifiedDateBehavior"].first,
+            unittest.equals(arg_modifiedDateBehavior));
+        unittest.expect(
+            queryMap["newRevision"].first, unittest.equals("$arg_newRevision"));
         unittest.expect(queryMap["ocr"].first, unittest.equals("$arg_ocr"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["pinned"].first, unittest.equals("$arg_pinned"));
-        unittest.expect(queryMap["removeParents"].first, unittest.equals(arg_removeParents));
-        unittest.expect(queryMap["setModifiedDate"].first, unittest.equals("$arg_setModifiedDate"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["timedTextLanguage"].first, unittest.equals(arg_timedTextLanguage));
-        unittest.expect(queryMap["timedTextTrackName"].first, unittest.equals(arg_timedTextTrackName));
-        unittest.expect(queryMap["updateViewedDate"].first, unittest.equals("$arg_updateViewedDate"));
-        unittest.expect(queryMap["useContentAsIndexableText"].first, unittest.equals("$arg_useContentAsIndexableText"));
-
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(
+            queryMap["pinned"].first, unittest.equals("$arg_pinned"));
+        unittest.expect(queryMap["removeParents"].first,
+            unittest.equals(arg_removeParents));
+        unittest.expect(queryMap["setModifiedDate"].first,
+            unittest.equals("$arg_setModifiedDate"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["timedTextLanguage"].first,
+            unittest.equals(arg_timedTextLanguage));
+        unittest.expect(queryMap["timedTextTrackName"].first,
+            unittest.equals(arg_timedTextTrackName));
+        unittest.expect(queryMap["updateViewedDate"].first,
+            unittest.equals("$arg_updateViewedDate"));
+        unittest.expect(queryMap["useContentAsIndexableText"].first,
+            unittest.equals("$arg_useContentAsIndexableText"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, addParents: arg_addParents, convert: arg_convert, modifiedDateBehavior: arg_modifiedDateBehavior, newRevision: arg_newRevision, ocr: arg_ocr, ocrLanguage: arg_ocrLanguage, pinned: arg_pinned, removeParents: arg_removeParents, setModifiedDate: arg_setModifiedDate, supportsTeamDrives: arg_supportsTeamDrives, timedTextLanguage: arg_timedTextLanguage, timedTextTrackName: arg_timedTextTrackName, updateViewedDate: arg_updateViewedDate, useContentAsIndexableText: arg_useContentAsIndexableText).then(unittest.expectAsync1(((api.File response) {
+      res
+          .update(arg_request, arg_fileId,
+              addParents: arg_addParents,
+              convert: arg_convert,
+              modifiedDateBehavior: arg_modifiedDateBehavior,
+              newRevision: arg_newRevision,
+              ocr: arg_ocr,
+              ocrLanguage: arg_ocrLanguage,
+              pinned: arg_pinned,
+              removeParents: arg_removeParents,
+              setModifiedDate: arg_setModifiedDate,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              timedTextLanguage: arg_timedTextLanguage,
+              timedTextTrackName: arg_timedTextTrackName,
+              updateViewedDate: arg_updateViewedDate,
+              useContentAsIndexableText: arg_useContentAsIndexableText)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
@@ -4530,18 +4872,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/watch", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/watch"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4554,36 +4901,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["acknowledgeAbuse"].first, unittest.equals("$arg_acknowledgeAbuse"));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-        unittest.expect(queryMap["revisionId"].first, unittest.equals(arg_revisionId));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["updateViewedDate"].first, unittest.equals("$arg_updateViewedDate"));
-
+        unittest.expect(queryMap["acknowledgeAbuse"].first,
+            unittest.equals("$arg_acknowledgeAbuse"));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(
+            queryMap["revisionId"].first, unittest.equals(arg_revisionId));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["updateViewedDate"].first,
+            unittest.equals("$arg_updateViewedDate"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, arg_fileId, acknowledgeAbuse: arg_acknowledgeAbuse, projection: arg_projection, revisionId: arg_revisionId, supportsTeamDrives: arg_supportsTeamDrives, updateViewedDate: arg_updateViewedDate).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request, arg_fileId,
+              acknowledgeAbuse: arg_acknowledgeAbuse,
+              projection: arg_projection,
+              revisionId: arg_revisionId,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              updateViewedDate: arg_updateViewedDate)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ParentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ParentsResourceApi res = new api.DriveApi(mock).parents;
       var arg_fileId = "foo";
@@ -4593,18 +4950,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/parents/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/parents/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4620,16 +4982,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4638,7 +5001,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ParentsResourceApi res = new api.DriveApi(mock).parents;
       var arg_fileId = "foo";
@@ -4648,18 +5010,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/parents/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/parents/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4675,27 +5042,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildParentReference());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_parentId).then(unittest.expectAsync1(((api.ParentReference response) {
+      res
+          .get(arg_fileId, arg_parentId)
+          .then(unittest.expectAsync1(((api.ParentReference response) {
         checkParentReference(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ParentsResourceApi res = new api.DriveApi(mock).parents;
       var arg_request = buildParentReference();
@@ -4709,18 +5078,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/parents"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/parents"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4733,28 +5107,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildParentReference());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_fileId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.ParentReference response) {
+      res
+          .insert(arg_request, arg_fileId,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.ParentReference response) {
         checkParentReference(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ParentsResourceApi res = new api.DriveApi(mock).parents;
       var arg_fileId = "foo";
@@ -4763,18 +5141,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/parents"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/parents"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4787,31 +5170,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildParentList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId).then(unittest.expectAsync1(((api.ParentList response) {
+      res
+          .list(arg_fileId)
+          .then(unittest.expectAsync1(((api.ParentList response) {
         checkParentList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PermissionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_fileId = "foo";
@@ -4822,18 +5205,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4849,26 +5237,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_permissionId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_permissionId,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_fileId = "foo";
@@ -4879,18 +5271,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4906,28 +5303,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_permissionId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .get(arg_fileId, arg_permissionId,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
 
     unittest.test("method--getIdForEmail", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_email = "foo";
@@ -4936,11 +5337,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("permissionIds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("permissionIds/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4956,27 +5360,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermissionId());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIdForEmail(arg_email).then(unittest.expectAsync1(((api.PermissionId response) {
+      res
+          .getIdForEmail(arg_email)
+          .then(unittest.expectAsync1(((api.PermissionId response) {
         checkPermissionId(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_request = buildPermission();
@@ -4992,18 +5398,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/permissions"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -5016,30 +5427,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["emailMessage"].first, unittest.equals(arg_emailMessage));
-        unittest.expect(queryMap["sendNotificationEmails"].first, unittest.equals("$arg_sendNotificationEmails"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(
+            queryMap["emailMessage"].first, unittest.equals(arg_emailMessage));
+        unittest.expect(queryMap["sendNotificationEmails"].first,
+            unittest.equals("$arg_sendNotificationEmails"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_fileId, emailMessage: arg_emailMessage, sendNotificationEmails: arg_sendNotificationEmails, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .insert(arg_request, arg_fileId,
+              emailMessage: arg_emailMessage,
+              sendNotificationEmails: arg_sendNotificationEmails,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_fileId = "foo";
@@ -5051,18 +5470,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/permissions"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -5075,30 +5499,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermissionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, maxResults: arg_maxResults, pageToken: arg_pageToken, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.PermissionList response) {
+      res
+          .list(arg_fileId,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.PermissionList response) {
         checkPermissionList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_request = buildPermission();
@@ -5115,18 +5547,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5142,30 +5579,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["removeExpiration"].first, unittest.equals("$arg_removeExpiration"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["transferOwnership"].first, unittest.equals("$arg_transferOwnership"));
-
+        unittest.expect(queryMap["removeExpiration"].first,
+            unittest.equals("$arg_removeExpiration"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["transferOwnership"].first,
+            unittest.equals("$arg_transferOwnership"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_fileId, arg_permissionId, removeExpiration: arg_removeExpiration, supportsTeamDrives: arg_supportsTeamDrives, transferOwnership: arg_transferOwnership).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .patch(arg_request, arg_fileId, arg_permissionId,
+              removeExpiration: arg_removeExpiration,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              transferOwnership: arg_transferOwnership)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_request = buildPermission();
@@ -5182,18 +5627,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5209,34 +5659,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["removeExpiration"].first, unittest.equals("$arg_removeExpiration"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["transferOwnership"].first, unittest.equals("$arg_transferOwnership"));
-
+        unittest.expect(queryMap["removeExpiration"].first,
+            unittest.equals("$arg_removeExpiration"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["transferOwnership"].first,
+            unittest.equals("$arg_transferOwnership"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_permissionId, removeExpiration: arg_removeExpiration, supportsTeamDrives: arg_supportsTeamDrives, transferOwnership: arg_transferOwnership).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .update(arg_request, arg_fileId, arg_permissionId,
+              removeExpiration: arg_removeExpiration,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              transferOwnership: arg_transferOwnership)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PropertiesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.PropertiesResourceApi res = new api.DriveApi(mock).properties;
       var arg_fileId = "foo";
@@ -5247,18 +5703,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/properties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/properties/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5274,26 +5735,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["visibility"].first, unittest.equals(arg_visibility));
-
+        unittest.expect(
+            queryMap["visibility"].first, unittest.equals(arg_visibility));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_propertyKey, visibility: arg_visibility).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_propertyKey, visibility: arg_visibility)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.PropertiesResourceApi res = new api.DriveApi(mock).properties;
       var arg_fileId = "foo";
@@ -5304,18 +5768,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/properties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/properties/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5331,28 +5800,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["visibility"].first, unittest.equals(arg_visibility));
-
+        unittest.expect(
+            queryMap["visibility"].first, unittest.equals(arg_visibility));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_propertyKey, visibility: arg_visibility).then(unittest.expectAsync1(((api.Property response) {
+      res
+          .get(arg_fileId, arg_propertyKey, visibility: arg_visibility)
+          .then(unittest.expectAsync1(((api.Property response) {
         checkProperty(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.PropertiesResourceApi res = new api.DriveApi(mock).properties;
       var arg_request = buildProperty();
@@ -5365,18 +5837,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/properties"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/properties"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -5389,27 +5866,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_fileId).then(unittest.expectAsync1(((api.Property response) {
+      res
+          .insert(arg_request, arg_fileId)
+          .then(unittest.expectAsync1(((api.Property response) {
         checkProperty(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PropertiesResourceApi res = new api.DriveApi(mock).properties;
       var arg_fileId = "foo";
@@ -5418,18 +5897,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/properties"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/properties"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -5442,27 +5926,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPropertyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId).then(unittest.expectAsync1(((api.PropertyList response) {
+      res
+          .list(arg_fileId)
+          .then(unittest.expectAsync1(((api.PropertyList response) {
         checkPropertyList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.PropertiesResourceApi res = new api.DriveApi(mock).properties;
       var arg_request = buildProperty();
@@ -5477,18 +5963,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/properties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/properties/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5504,28 +5995,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["visibility"].first, unittest.equals(arg_visibility));
-
+        unittest.expect(
+            queryMap["visibility"].first, unittest.equals(arg_visibility));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_fileId, arg_propertyKey, visibility: arg_visibility).then(unittest.expectAsync1(((api.Property response) {
+      res
+          .patch(arg_request, arg_fileId, arg_propertyKey,
+              visibility: arg_visibility)
+          .then(unittest.expectAsync1(((api.Property response) {
         checkProperty(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.PropertiesResourceApi res = new api.DriveApi(mock).properties;
       var arg_request = buildProperty();
@@ -5540,18 +6035,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/properties/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/properties/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5567,29 +6067,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["visibility"].first, unittest.equals(arg_visibility));
-
+        unittest.expect(
+            queryMap["visibility"].first, unittest.equals(arg_visibility));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProperty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_propertyKey, visibility: arg_visibility).then(unittest.expectAsync1(((api.Property response) {
+      res
+          .update(arg_request, arg_fileId, arg_propertyKey,
+              visibility: arg_visibility)
+          .then(unittest.expectAsync1(((api.Property response) {
         checkProperty(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RealtimeResourceApi", () {
     unittest.test("method--get", () {
       // TODO: Implement tests for media upload;
@@ -5604,18 +6107,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/realtime", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/realtime"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/realtime"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5628,22 +6136,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["revision"].first), unittest.equals(arg_revision));
-
+        unittest.expect(core.int.parse(queryMap["revision"].first),
+            unittest.equals(arg_revision));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, revision: arg_revision).then(unittest.expectAsync1((_) {}));
+      res
+          .get(arg_fileId, revision: arg_revision)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--update", () {
@@ -5659,18 +6171,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/realtime", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/realtime"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/realtime"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5683,30 +6200,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["baseRevision"].first, unittest.equals(arg_baseRevision));
-
+        unittest.expect(
+            queryMap["baseRevision"].first, unittest.equals(arg_baseRevision));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_fileId, baseRevision: arg_baseRevision).then(unittest.expectAsync1((_) {}));
+      res
+          .update(arg_fileId, baseRevision: arg_baseRevision)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-RepliesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_fileId = "foo";
@@ -5717,25 +6235,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5751,25 +6276,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_commentId, arg_replyId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_commentId, arg_replyId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_fileId = "foo";
@@ -5781,25 +6308,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5815,28 +6349,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_commentId, arg_replyId, includeDeleted: arg_includeDeleted).then(unittest.expectAsync1(((api.CommentReply response) {
+      res
+          .get(arg_fileId, arg_commentId, arg_replyId,
+              includeDeleted: arg_includeDeleted)
+          .then(unittest.expectAsync1(((api.CommentReply response) {
         checkCommentReply(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_request = buildCommentReply();
@@ -5850,25 +6388,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/replies"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/replies"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5881,27 +6426,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_fileId, arg_commentId).then(unittest.expectAsync1(((api.CommentReply response) {
+      res
+          .insert(arg_request, arg_fileId, arg_commentId)
+          .then(unittest.expectAsync1(((api.CommentReply response) {
         checkCommentReply(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_fileId = "foo";
@@ -5914,25 +6461,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/replies"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/replies"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5945,30 +6499,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentReplyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, arg_commentId, includeDeleted: arg_includeDeleted, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.CommentReplyList response) {
+      res
+          .list(arg_fileId, arg_commentId,
+              includeDeleted: arg_includeDeleted,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.CommentReplyList response) {
         checkCommentReplyList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_request = buildCommentReply();
@@ -5983,25 +6545,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6017,27 +6586,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_fileId, arg_commentId, arg_replyId).then(unittest.expectAsync1(((api.CommentReply response) {
+      res
+          .patch(arg_request, arg_fileId, arg_commentId, arg_replyId)
+          .then(unittest.expectAsync1(((api.CommentReply response) {
         checkCommentReply(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_request = buildCommentReply();
@@ -6052,25 +6623,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6086,31 +6664,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_commentId, arg_replyId).then(unittest.expectAsync1(((api.CommentReply response) {
+      res
+          .update(arg_request, arg_fileId, arg_commentId, arg_replyId)
+          .then(unittest.expectAsync1(((api.CommentReply response) {
         checkCommentReply(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RevisionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_fileId = "foo";
@@ -6120,18 +6698,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6147,25 +6730,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_revisionId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_revisionId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_fileId = "foo";
@@ -6175,18 +6760,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6202,27 +6792,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevision());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_revisionId).then(unittest.expectAsync1(((api.Revision response) {
+      res
+          .get(arg_fileId, arg_revisionId)
+          .then(unittest.expectAsync1(((api.Revision response) {
         checkRevision(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_fileId = "foo";
@@ -6233,18 +6825,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/revisions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/revisions"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -6257,29 +6854,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevisionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RevisionList response) {
+      res
+          .list(arg_fileId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RevisionList response) {
         checkRevisionList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_request = buildRevision();
@@ -6293,18 +6895,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6320,27 +6927,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevision());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_fileId, arg_revisionId).then(unittest.expectAsync1(((api.Revision response) {
+      res
+          .patch(arg_request, arg_fileId, arg_revisionId)
+          .then(unittest.expectAsync1(((api.Revision response) {
         checkRevision(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_request = buildRevision();
@@ -6354,18 +6963,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6381,31 +6995,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevision());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_revisionId).then(unittest.expectAsync1(((api.Revision response) {
+      res
+          .update(arg_request, arg_fileId, arg_revisionId)
+          .then(unittest.expectAsync1(((api.Revision response) {
         checkRevision(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TeamdrivesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_teamDriveId = "foo";
@@ -6414,11 +7028,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("teamdrives/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("teamdrives/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6434,16 +7051,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -6452,7 +7070,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_teamDriveId = "foo";
@@ -6461,11 +7078,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("teamdrives/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("teamdrives/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6481,27 +7101,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDrive());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_teamDriveId).then(unittest.expectAsync1(((api.TeamDrive response) {
+      res
+          .get(arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.TeamDrive response) {
         checkTeamDrive(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_request = buildTeamDrive();
@@ -6514,11 +7136,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("teamdrives"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("teamdrives"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -6531,28 +7156,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDrive());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_requestId).then(unittest.expectAsync1(((api.TeamDrive response) {
+      res
+          .insert(arg_request, arg_requestId)
+          .then(unittest.expectAsync1(((api.TeamDrive response) {
         checkTeamDrive(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_maxResults = 42;
@@ -6562,11 +7190,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("teamdrives"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("teamdrives"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -6579,29 +7210,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDriveList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TeamDriveList response) {
+      res
+          .list(maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TeamDriveList response) {
         checkTeamDriveList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_request = buildTeamDrive();
@@ -6614,11 +7249,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v2/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("teamdrives/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("teamdrives/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6634,27 +7272,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDrive());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_teamDriveId).then(unittest.expectAsync1(((api.TeamDrive response) {
+      res
+          .update(arg_request, arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.TeamDrive response) {
         checkTeamDrive(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/drive/v3_test.dart b/generated/googleapis/test/drive/v3_test.dart
index 566c793..ae0cb64 100644
--- a/generated/googleapis/test/drive/v3_test.dart
+++ b/generated/googleapis/test/drive/v3_test.dart
@@ -1,12 +1,10 @@
 library googleapis.drive.v3.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/drive/v3.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,85 +44,85 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
+buildUnnamed1608() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1608(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1609() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1608();
+  o["y"] = buildUnnamed1608();
+  return o;
+}
+
+checkUnnamed1609(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1608(o["x"]);
+  checkUnnamed1608(o["y"]);
+}
+
+buildUnnamed1610() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1610(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1611() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1611(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1612() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1611();
+  o["y"] = buildUnnamed1611();
+  return o;
+}
+
+checkUnnamed1612(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1611(o["x"]);
+  checkUnnamed1611(o["y"]);
+}
+
 buildUnnamed1613() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1613(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1614() {
-  var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1613();
-  o["y"] = buildUnnamed1613();
-  return o;
-}
-
-checkUnnamed1614(core.Map<core.String, core.List<core.String>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1613(o["x"]);
-  checkUnnamed1613(o["y"]);
-}
-
-buildUnnamed1615() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1615(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1616() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1616(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1617() {
-  var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1616();
-  o["y"] = buildUnnamed1616();
-  return o;
-}
-
-checkUnnamed1617(core.Map<core.String, core.List<core.String>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1616(o["x"]);
-  checkUnnamed1616(o["y"]);
-}
-
-buildUnnamed1618() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1618(core.Map<core.String, core.String> o) {
+checkUnnamed1613(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -177,14 +176,14 @@
   buildCounterAboutTeamDriveThemes--;
 }
 
-buildUnnamed1619() {
+buildUnnamed1614() {
   var o = new core.List<api.AboutTeamDriveThemes>();
   o.add(buildAboutTeamDriveThemes());
   o.add(buildAboutTeamDriveThemes());
   return o;
 }
 
-checkUnnamed1619(core.List<api.AboutTeamDriveThemes> o) {
+checkUnnamed1614(core.List<api.AboutTeamDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutTeamDriveThemes(o[0]);
   checkAboutTeamDriveThemes(o[1]);
@@ -196,14 +195,14 @@
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
     o.appInstalled = true;
-    o.exportFormats = buildUnnamed1614();
-    o.folderColorPalette = buildUnnamed1615();
-    o.importFormats = buildUnnamed1617();
+    o.exportFormats = buildUnnamed1609();
+    o.folderColorPalette = buildUnnamed1610();
+    o.importFormats = buildUnnamed1612();
     o.kind = "foo";
-    o.maxImportSizes = buildUnnamed1618();
+    o.maxImportSizes = buildUnnamed1613();
     o.maxUploadSize = "foo";
     o.storageQuota = buildAboutStorageQuota();
-    o.teamDriveThemes = buildUnnamed1619();
+    o.teamDriveThemes = buildUnnamed1614();
     o.user = buildUser();
   }
   buildCounterAbout--;
@@ -214,14 +213,14 @@
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
     unittest.expect(o.appInstalled, unittest.isTrue);
-    checkUnnamed1614(o.exportFormats);
-    checkUnnamed1615(o.folderColorPalette);
-    checkUnnamed1617(o.importFormats);
+    checkUnnamed1609(o.exportFormats);
+    checkUnnamed1610(o.folderColorPalette);
+    checkUnnamed1612(o.importFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1618(o.maxImportSizes);
+    checkUnnamed1613(o.maxImportSizes);
     unittest.expect(o.maxUploadSize, unittest.equals('foo'));
     checkAboutStorageQuota(o.storageQuota);
-    checkUnnamed1619(o.teamDriveThemes);
+    checkUnnamed1614(o.teamDriveThemes);
     checkUser(o.user);
   }
   buildCounterAbout--;
@@ -254,20 +253,21 @@
     unittest.expect(o.removed, unittest.isTrue);
     checkTeamDrive(o.teamDrive);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
-    unittest.expect(o.time, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.time, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterChange--;
 }
 
-buildUnnamed1620() {
+buildUnnamed1615() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1620(core.List<api.Change> o) {
+checkUnnamed1615(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -278,7 +278,7 @@
   var o = new api.ChangeList();
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
-    o.changes = buildUnnamed1620();
+    o.changes = buildUnnamed1615();
     o.kind = "foo";
     o.newStartPageToken = "foo";
     o.nextPageToken = "foo";
@@ -290,7 +290,7 @@
 checkChangeList(api.ChangeList o) {
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
-    checkUnnamed1620(o.changes);
+    checkUnnamed1615(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.newStartPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -298,14 +298,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed1621() {
+buildUnnamed1616() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1621(core.Map<core.String, core.String> o) {
+checkUnnamed1616(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -320,7 +320,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed1621();
+    o.params = buildUnnamed1616();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -338,7 +338,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1621(o.params);
+    checkUnnamed1616(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -369,14 +369,14 @@
   buildCounterCommentQuotedFileContent--;
 }
 
-buildUnnamed1622() {
+buildUnnamed1617() {
   var o = new core.List<api.Reply>();
   o.add(buildReply());
   o.add(buildReply());
   return o;
 }
 
-checkUnnamed1622(core.List<api.Reply> o) {
+checkUnnamed1617(core.List<api.Reply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReply(o[0]);
   checkReply(o[1]);
@@ -397,7 +397,7 @@
     o.kind = "foo";
     o.modifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.quotedFileContent = buildCommentQuotedFileContent();
-    o.replies = buildUnnamed1622();
+    o.replies = buildUnnamed1617();
     o.resolved = true;
   }
   buildCounterComment--;
@@ -410,27 +410,29 @@
     unittest.expect(o.anchor, unittest.equals('foo'));
     checkUser(o.author);
     unittest.expect(o.content, unittest.equals('foo'));
-    unittest.expect(o.createdTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkCommentQuotedFileContent(o.quotedFileContent);
-    checkUnnamed1622(o.replies);
+    checkUnnamed1617(o.replies);
     unittest.expect(o.resolved, unittest.isTrue);
   }
   buildCounterComment--;
 }
 
-buildUnnamed1623() {
+buildUnnamed1618() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1623(core.List<api.Comment> o) {
+checkUnnamed1618(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -441,7 +443,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.comments = buildUnnamed1623();
+    o.comments = buildUnnamed1618();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -452,21 +454,21 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed1623(o.comments);
+    checkUnnamed1618(o.comments);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCommentList--;
 }
 
-buildUnnamed1624() {
+buildUnnamed1619() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1624(core.Map<core.String, core.String> o) {
+checkUnnamed1619(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -647,66 +649,79 @@
   buildCounterFileImageMediaMetadata--;
 }
 
-buildUnnamed1625() {
+buildUnnamed1620() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed1625(core.List<api.User> o) {
+checkUnnamed1620(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed1626() {
+buildUnnamed1621() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1626(core.List<core.String> o) {
+checkUnnamed1621(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1627() {
+buildUnnamed1622() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1622(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1623() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1627(core.List<api.Permission> o) {
+checkUnnamed1623(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed1628() {
+buildUnnamed1624() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1628(core.Map<core.String, core.String> o) {
+checkUnnamed1624(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1629() {
+buildUnnamed1625() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1629(core.List<core.String> o) {
+checkUnnamed1625(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -740,7 +755,7 @@
   var o = new api.File();
   buildCounterFile++;
   if (buildCounterFile < 3) {
-    o.appProperties = buildUnnamed1624();
+    o.appProperties = buildUnnamed1619();
     o.capabilities = buildFileCapabilities();
     o.contentHints = buildFileContentHints();
     o.createdTime = core.DateTime.parse("2002-02-27T14:01:02");
@@ -766,16 +781,17 @@
     o.name = "foo";
     o.originalFilename = "foo";
     o.ownedByMe = true;
-    o.owners = buildUnnamed1625();
-    o.parents = buildUnnamed1626();
-    o.permissions = buildUnnamed1627();
-    o.properties = buildUnnamed1628();
+    o.owners = buildUnnamed1620();
+    o.parents = buildUnnamed1621();
+    o.permissionIds = buildUnnamed1622();
+    o.permissions = buildUnnamed1623();
+    o.properties = buildUnnamed1624();
     o.quotaBytesUsed = "foo";
     o.shared = true;
     o.sharedWithMeTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.sharingUser = buildUser();
     o.size = "foo";
-    o.spaces = buildUnnamed1629();
+    o.spaces = buildUnnamed1625();
     o.starred = true;
     o.teamDriveId = "foo";
     o.thumbnailLink = "foo";
@@ -799,10 +815,11 @@
 checkFile(api.File o) {
   buildCounterFile++;
   if (buildCounterFile < 3) {
-    checkUnnamed1624(o.appProperties);
+    checkUnnamed1619(o.appProperties);
     checkFileCapabilities(o.capabilities);
     checkFileContentHints(o.contentHints);
-    unittest.expect(o.createdTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
@@ -820,32 +837,38 @@
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.modifiedByMe, unittest.isTrue);
-    unittest.expect(o.modifiedByMeTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedByMeTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.originalFilename, unittest.equals('foo'));
     unittest.expect(o.ownedByMe, unittest.isTrue);
-    checkUnnamed1625(o.owners);
-    checkUnnamed1626(o.parents);
-    checkUnnamed1627(o.permissions);
-    checkUnnamed1628(o.properties);
+    checkUnnamed1620(o.owners);
+    checkUnnamed1621(o.parents);
+    checkUnnamed1622(o.permissionIds);
+    checkUnnamed1623(o.permissions);
+    checkUnnamed1624(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.shared, unittest.isTrue);
-    unittest.expect(o.sharedWithMeTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.sharedWithMeTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUser(o.sharingUser);
     unittest.expect(o.size, unittest.equals('foo'));
-    checkUnnamed1629(o.spaces);
+    checkUnnamed1625(o.spaces);
     unittest.expect(o.starred, unittest.isTrue);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
     unittest.expect(o.thumbnailLink, unittest.equals('foo'));
     unittest.expect(o.thumbnailVersion, unittest.equals('foo'));
     unittest.expect(o.trashed, unittest.isTrue);
-    unittest.expect(o.trashedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.trashedTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUser(o.trashingUser);
     unittest.expect(o.version, unittest.equals('foo'));
     checkFileVideoMediaMetadata(o.videoMediaMetadata);
     unittest.expect(o.viewedByMe, unittest.isTrue);
-    unittest.expect(o.viewedByMeTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.viewedByMeTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.viewersCanCopyContent, unittest.isTrue);
     unittest.expect(o.webContentLink, unittest.equals('foo'));
     unittest.expect(o.webViewLink, unittest.equals('foo'));
@@ -854,14 +877,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed1630() {
+buildUnnamed1626() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed1630(core.List<api.File> o) {
+checkUnnamed1626(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -872,7 +895,7 @@
   var o = new api.FileList();
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
-    o.files = buildUnnamed1630();
+    o.files = buildUnnamed1626();
     o.incompleteSearch = true;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -884,7 +907,7 @@
 checkFileList(api.FileList o) {
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
-    checkUnnamed1630(o.files);
+    checkUnnamed1626(o.files);
     unittest.expect(o.incompleteSearch, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -892,14 +915,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed1631() {
+buildUnnamed1627() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1631(core.List<core.String> o) {
+checkUnnamed1627(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -910,7 +933,7 @@
   var o = new api.GeneratedIds();
   buildCounterGeneratedIds++;
   if (buildCounterGeneratedIds < 3) {
-    o.ids = buildUnnamed1631();
+    o.ids = buildUnnamed1627();
     o.kind = "foo";
     o.space = "foo";
   }
@@ -921,7 +944,7 @@
 checkGeneratedIds(api.GeneratedIds o) {
   buildCounterGeneratedIds++;
   if (buildCounterGeneratedIds < 3) {
-    checkUnnamed1631(o.ids);
+    checkUnnamed1627(o.ids);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.space, unittest.equals('foo'));
   }
@@ -942,7 +965,8 @@
   return o;
 }
 
-checkPermissionTeamDrivePermissionDetails(api.PermissionTeamDrivePermissionDetails o) {
+checkPermissionTeamDrivePermissionDetails(
+    api.PermissionTeamDrivePermissionDetails o) {
   buildCounterPermissionTeamDrivePermissionDetails++;
   if (buildCounterPermissionTeamDrivePermissionDetails < 3) {
     unittest.expect(o.inherited, unittest.isTrue);
@@ -953,14 +977,14 @@
   buildCounterPermissionTeamDrivePermissionDetails--;
 }
 
-buildUnnamed1632() {
+buildUnnamed1628() {
   var o = new core.List<api.PermissionTeamDrivePermissionDetails>();
   o.add(buildPermissionTeamDrivePermissionDetails());
   o.add(buildPermissionTeamDrivePermissionDetails());
   return o;
 }
 
-checkUnnamed1632(core.List<api.PermissionTeamDrivePermissionDetails> o) {
+checkUnnamed1628(core.List<api.PermissionTeamDrivePermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionTeamDrivePermissionDetails(o[0]);
   checkPermissionTeamDrivePermissionDetails(o[1]);
@@ -981,7 +1005,7 @@
     o.kind = "foo";
     o.photoLink = "foo";
     o.role = "foo";
-    o.teamDrivePermissionDetails = buildUnnamed1632();
+    o.teamDrivePermissionDetails = buildUnnamed1628();
     o.type = "foo";
   }
   buildCounterPermission--;
@@ -996,25 +1020,26 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
-    unittest.expect(o.expirationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.expirationTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.photoLink, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
-    checkUnnamed1632(o.teamDrivePermissionDetails);
+    checkUnnamed1628(o.teamDrivePermissionDetails);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPermission--;
 }
 
-buildUnnamed1633() {
+buildUnnamed1629() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1633(core.List<api.Permission> o) {
+checkUnnamed1629(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1027,7 +1052,7 @@
   if (buildCounterPermissionList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.permissions = buildUnnamed1633();
+    o.permissions = buildUnnamed1629();
   }
   buildCounterPermissionList--;
   return o;
@@ -1038,7 +1063,7 @@
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1633(o.permissions);
+    checkUnnamed1629(o.permissions);
   }
   buildCounterPermissionList--;
 }
@@ -1068,24 +1093,26 @@
     unittest.expect(o.action, unittest.equals('foo'));
     checkUser(o.author);
     unittest.expect(o.content, unittest.equals('foo'));
-    unittest.expect(o.createdTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterReply--;
 }
 
-buildUnnamed1634() {
+buildUnnamed1630() {
   var o = new core.List<api.Reply>();
   o.add(buildReply());
   o.add(buildReply());
   return o;
 }
 
-checkUnnamed1634(core.List<api.Reply> o) {
+checkUnnamed1630(core.List<api.Reply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReply(o[0]);
   checkReply(o[1]);
@@ -1098,7 +1125,7 @@
   if (buildCounterReplyList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.replies = buildUnnamed1634();
+    o.replies = buildUnnamed1630();
   }
   buildCounterReplyList--;
   return o;
@@ -1109,7 +1136,7 @@
   if (buildCounterReplyList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1634(o.replies);
+    checkUnnamed1630(o.replies);
   }
   buildCounterReplyList--;
 }
@@ -1145,7 +1172,8 @@
     checkUser(o.lastModifyingUser);
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
-    unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.modifiedTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.originalFilename, unittest.equals('foo'));
     unittest.expect(o.publishAuto, unittest.isTrue);
     unittest.expect(o.published, unittest.isTrue);
@@ -1155,14 +1183,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed1635() {
+buildUnnamed1631() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed1635(core.List<api.Revision> o) {
+checkUnnamed1631(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -1175,7 +1203,7 @@
   if (buildCounterRevisionList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.revisions = buildUnnamed1635();
+    o.revisions = buildUnnamed1631();
   }
   buildCounterRevisionList--;
   return o;
@@ -1186,7 +1214,7 @@
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1635(o.revisions);
+    checkUnnamed1631(o.revisions);
   }
   buildCounterRevisionList--;
 }
@@ -1315,14 +1343,14 @@
   buildCounterTeamDrive--;
 }
 
-buildUnnamed1636() {
+buildUnnamed1632() {
   var o = new core.List<api.TeamDrive>();
   o.add(buildTeamDrive());
   o.add(buildTeamDrive());
   return o;
 }
 
-checkUnnamed1636(core.List<api.TeamDrive> o) {
+checkUnnamed1632(core.List<api.TeamDrive> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTeamDrive(o[0]);
   checkTeamDrive(o[1]);
@@ -1335,7 +1363,7 @@
   if (buildCounterTeamDriveList < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.teamDrives = buildUnnamed1636();
+    o.teamDrives = buildUnnamed1632();
   }
   buildCounterTeamDriveList--;
   return o;
@@ -1346,7 +1374,7 @@
   if (buildCounterTeamDriveList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1636(o.teamDrives);
+    checkUnnamed1632(o.teamDrives);
   }
   buildCounterTeamDriveList--;
 }
@@ -1380,7 +1408,6 @@
   buildCounterUser--;
 }
 
-
 main() {
   unittest.group("obj-schema-AboutStorageQuota", () {
     unittest.test("to-json--from-json", () {
@@ -1390,7 +1417,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AboutTeamDriveThemes", () {
     unittest.test("to-json--from-json", () {
       var o = buildAboutTeamDriveThemes();
@@ -1399,7 +1425,6 @@
     });
   });
 
-
   unittest.group("obj-schema-About", () {
     unittest.test("to-json--from-json", () {
       var o = buildAbout();
@@ -1408,7 +1433,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Change", () {
     unittest.test("to-json--from-json", () {
       var o = buildChange();
@@ -1417,7 +1441,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChangeList", () {
     unittest.test("to-json--from-json", () {
       var o = buildChangeList();
@@ -1426,7 +1449,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Channel", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannel();
@@ -1435,7 +1457,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentQuotedFileContent", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentQuotedFileContent();
@@ -1444,7 +1465,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Comment", () {
     unittest.test("to-json--from-json", () {
       var o = buildComment();
@@ -1453,7 +1473,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentList", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentList();
@@ -1462,7 +1481,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileCapabilities", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileCapabilities();
@@ -1471,7 +1489,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileContentHintsThumbnail", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileContentHintsThumbnail();
@@ -1480,7 +1497,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileContentHints", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileContentHints();
@@ -1489,7 +1505,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileImageMediaMetadataLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileImageMediaMetadataLocation();
@@ -1498,7 +1513,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileImageMediaMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileImageMediaMetadata();
@@ -1507,7 +1521,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileVideoMediaMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileVideoMediaMetadata();
@@ -1516,7 +1529,6 @@
     });
   });
 
-
   unittest.group("obj-schema-File", () {
     unittest.test("to-json--from-json", () {
       var o = buildFile();
@@ -1525,7 +1537,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FileList", () {
     unittest.test("to-json--from-json", () {
       var o = buildFileList();
@@ -1534,7 +1545,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GeneratedIds", () {
     unittest.test("to-json--from-json", () {
       var o = buildGeneratedIds();
@@ -1543,16 +1553,15 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionTeamDrivePermissionDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionTeamDrivePermissionDetails();
-      var od = new api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
+      var od =
+          new api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
       checkPermissionTeamDrivePermissionDetails(od);
     });
   });
 
-
   unittest.group("obj-schema-Permission", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermission();
@@ -1561,7 +1570,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PermissionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildPermissionList();
@@ -1570,7 +1578,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Reply", () {
     unittest.test("to-json--from-json", () {
       var o = buildReply();
@@ -1579,7 +1586,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReplyList", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplyList();
@@ -1588,7 +1594,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Revision", () {
     unittest.test("to-json--from-json", () {
       var o = buildRevision();
@@ -1597,7 +1602,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RevisionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRevisionList();
@@ -1606,7 +1610,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StartPageToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildStartPageToken();
@@ -1615,7 +1618,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDriveBackgroundImageFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDriveBackgroundImageFile();
@@ -1624,7 +1626,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDriveCapabilities", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDriveCapabilities();
@@ -1633,7 +1634,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDrive", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDrive();
@@ -1642,7 +1642,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TeamDriveList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTeamDriveList();
@@ -1651,7 +1650,6 @@
     });
   });
 
-
   unittest.group("obj-schema-User", () {
     unittest.test("to-json--from-json", () {
       var o = buildUser();
@@ -1660,10 +1658,8 @@
     });
   });
 
-
   unittest.group("resource-AboutResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AboutResourceApi res = new api.DriveApi(mock).about;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1671,11 +1667,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("about"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("about"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1688,16 +1687,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAbout());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1706,13 +1706,10 @@
         checkAbout(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChangesResourceApi", () {
     unittest.test("method--getStartPageToken", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_supportsTeamDrives = true;
@@ -1722,11 +1719,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("changes/startPageToken"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("changes/startPageToken"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -1739,29 +1739,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStartPageToken());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getStartPageToken(supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.StartPageToken response) {
+      res
+          .getStartPageToken(
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.StartPageToken response) {
         checkStartPageToken(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_pageToken = "foo";
@@ -1778,11 +1784,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("changes"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("changes"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1795,36 +1804,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["includeCorpusRemovals"].first, unittest.equals("$arg_includeCorpusRemovals"));
-        unittest.expect(queryMap["includeRemoved"].first, unittest.equals("$arg_includeRemoved"));
-        unittest.expect(queryMap["includeTeamDriveItems"].first, unittest.equals("$arg_includeTeamDriveItems"));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["restrictToMyDrive"].first, unittest.equals("$arg_restrictToMyDrive"));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["includeCorpusRemovals"].first,
+            unittest.equals("$arg_includeCorpusRemovals"));
+        unittest.expect(queryMap["includeRemoved"].first,
+            unittest.equals("$arg_includeRemoved"));
+        unittest.expect(queryMap["includeTeamDriveItems"].first,
+            unittest.equals("$arg_includeTeamDriveItems"));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["restrictToMyDrive"].first,
+            unittest.equals("$arg_restrictToMyDrive"));
         unittest.expect(queryMap["spaces"].first, unittest.equals(arg_spaces));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChangeList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_pageToken, includeCorpusRemovals: arg_includeCorpusRemovals, includeRemoved: arg_includeRemoved, includeTeamDriveItems: arg_includeTeamDriveItems, pageSize: arg_pageSize, restrictToMyDrive: arg_restrictToMyDrive, spaces: arg_spaces, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.ChangeList response) {
+      res
+          .list(arg_pageToken,
+              includeCorpusRemovals: arg_includeCorpusRemovals,
+              includeRemoved: arg_includeRemoved,
+              includeTeamDriveItems: arg_includeTeamDriveItems,
+              pageSize: arg_pageSize,
+              restrictToMyDrive: arg_restrictToMyDrive,
+              spaces: arg_spaces,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.ChangeList response) {
         checkChangeList(response);
       })));
     });
 
     unittest.test("method--watch", () {
-
       var mock = new HttpServerMock();
       api.ChangesResourceApi res = new api.DriveApi(mock).changes;
       var arg_request = buildChannel();
@@ -1845,11 +1872,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("changes/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("changes/watch"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1862,40 +1892,56 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["includeCorpusRemovals"].first, unittest.equals("$arg_includeCorpusRemovals"));
-        unittest.expect(queryMap["includeRemoved"].first, unittest.equals("$arg_includeRemoved"));
-        unittest.expect(queryMap["includeTeamDriveItems"].first, unittest.equals("$arg_includeTeamDriveItems"));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["restrictToMyDrive"].first, unittest.equals("$arg_restrictToMyDrive"));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["includeCorpusRemovals"].first,
+            unittest.equals("$arg_includeCorpusRemovals"));
+        unittest.expect(queryMap["includeRemoved"].first,
+            unittest.equals("$arg_includeRemoved"));
+        unittest.expect(queryMap["includeTeamDriveItems"].first,
+            unittest.equals("$arg_includeTeamDriveItems"));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["restrictToMyDrive"].first,
+            unittest.equals("$arg_restrictToMyDrive"));
         unittest.expect(queryMap["spaces"].first, unittest.equals(arg_spaces));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, arg_pageToken, includeCorpusRemovals: arg_includeCorpusRemovals, includeRemoved: arg_includeRemoved, includeTeamDriveItems: arg_includeTeamDriveItems, pageSize: arg_pageSize, restrictToMyDrive: arg_restrictToMyDrive, spaces: arg_spaces, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request, arg_pageToken,
+              includeCorpusRemovals: arg_includeCorpusRemovals,
+              includeRemoved: arg_includeRemoved,
+              includeTeamDriveItems: arg_includeTeamDriveItems,
+              pageSize: arg_pageSize,
+              restrictToMyDrive: arg_restrictToMyDrive,
+              spaces: arg_spaces,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelsResourceApi", () {
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.ChannelsResourceApi res = new api.DriveApi(mock).channels;
       var arg_request = buildChannel();
@@ -1907,11 +1953,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("channels/stop"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("channels/stop"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1924,29 +1973,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.stop(arg_request).then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-CommentsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_request = buildComment();
@@ -1959,18 +2006,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/comments"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1983,27 +2035,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_fileId).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .create(arg_request, arg_fileId)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_fileId = "foo";
@@ -2013,18 +2067,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2040,16 +2099,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2058,7 +2118,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_fileId = "foo";
@@ -2069,18 +2128,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2096,28 +2160,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_commentId, includeDeleted: arg_includeDeleted).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .get(arg_fileId, arg_commentId, includeDeleted: arg_includeDeleted)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_fileId = "foo";
@@ -2130,18 +2197,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/comments"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2154,31 +2226,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["startModifiedTime"].first, unittest.equals(arg_startModifiedTime));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["startModifiedTime"].first,
+            unittest.equals(arg_startModifiedTime));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, includeDeleted: arg_includeDeleted, pageSize: arg_pageSize, pageToken: arg_pageToken, startModifiedTime: arg_startModifiedTime).then(unittest.expectAsync1(((api.CommentList response) {
+      res
+          .list(arg_fileId,
+              includeDeleted: arg_includeDeleted,
+              pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
+              startModifiedTime: arg_startModifiedTime)
+          .then(unittest.expectAsync1(((api.CommentList response) {
         checkCommentList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.DriveApi(mock).comments;
       var arg_request = buildComment();
@@ -2192,18 +2274,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2219,31 +2306,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_commentId).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .update(arg_request, arg_fileId, arg_commentId)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-FilesResourceApi", () {
     unittest.test("method--copy", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_request = buildFile();
@@ -2260,18 +2347,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/copy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/copy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/copy"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -2284,25 +2376,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["ignoreDefaultVisibility"].first, unittest.equals("$arg_ignoreDefaultVisibility"));
-        unittest.expect(queryMap["keepRevisionForever"].first, unittest.equals("$arg_keepRevisionForever"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["ignoreDefaultVisibility"].first,
+            unittest.equals("$arg_ignoreDefaultVisibility"));
+        unittest.expect(queryMap["keepRevisionForever"].first,
+            unittest.equals("$arg_keepRevisionForever"));
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.copy(arg_request, arg_fileId, ignoreDefaultVisibility: arg_ignoreDefaultVisibility, keepRevisionForever: arg_keepRevisionForever, ocrLanguage: arg_ocrLanguage, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.File response) {
+      res
+          .copy(arg_request, arg_fileId,
+              ignoreDefaultVisibility: arg_ignoreDefaultVisibility,
+              keepRevisionForever: arg_keepRevisionForever,
+              ocrLanguage: arg_ocrLanguage,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
@@ -2327,11 +2430,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("files"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("files"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -2344,32 +2450,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["ignoreDefaultVisibility"].first, unittest.equals("$arg_ignoreDefaultVisibility"));
-        unittest.expect(queryMap["keepRevisionForever"].first, unittest.equals("$arg_keepRevisionForever"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["useContentAsIndexableText"].first, unittest.equals("$arg_useContentAsIndexableText"));
-
+        unittest.expect(queryMap["ignoreDefaultVisibility"].first,
+            unittest.equals("$arg_ignoreDefaultVisibility"));
+        unittest.expect(queryMap["keepRevisionForever"].first,
+            unittest.equals("$arg_keepRevisionForever"));
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["useContentAsIndexableText"].first,
+            unittest.equals("$arg_useContentAsIndexableText"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, ignoreDefaultVisibility: arg_ignoreDefaultVisibility, keepRevisionForever: arg_keepRevisionForever, ocrLanguage: arg_ocrLanguage, supportsTeamDrives: arg_supportsTeamDrives, useContentAsIndexableText: arg_useContentAsIndexableText).then(unittest.expectAsync1(((api.File response) {
+      res
+          .create(arg_request,
+              ignoreDefaultVisibility: arg_ignoreDefaultVisibility,
+              keepRevisionForever: arg_keepRevisionForever,
+              ocrLanguage: arg_ocrLanguage,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              useContentAsIndexableText: arg_useContentAsIndexableText)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_fileId = "foo";
@@ -2379,11 +2497,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2399,26 +2520,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--emptyTrash", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2426,11 +2550,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("files/trash"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("files/trash"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -2443,16 +2570,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2473,18 +2601,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/export", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/export"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/export"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2497,17 +2630,19 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["mimeType"].first, unittest.equals(arg_mimeType));
-
+        unittest.expect(
+            queryMap["mimeType"].first, unittest.equals(arg_mimeType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2516,7 +2651,6 @@
     });
 
     unittest.test("method--generateIds", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_count = 42;
@@ -2526,11 +2660,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("files/generateIds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("files/generateIds"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -2543,23 +2680,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["count"].first), unittest.equals(arg_count));
+        unittest.expect(core.int.parse(queryMap["count"].first),
+            unittest.equals(arg_count));
         unittest.expect(queryMap["space"].first, unittest.equals(arg_space));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGeneratedIds());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateIds(count: arg_count, space: arg_space).then(unittest.expectAsync1(((api.GeneratedIds response) {
+      res
+          .generateIds(count: arg_count, space: arg_space)
+          .then(unittest.expectAsync1(((api.GeneratedIds response) {
         checkGeneratedIds(response);
       })));
     });
@@ -2578,11 +2719,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2598,29 +2742,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["acknowledgeAbuse"].first, unittest.equals("$arg_acknowledgeAbuse"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["acknowledgeAbuse"].first,
+            unittest.equals("$arg_acknowledgeAbuse"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, acknowledgeAbuse: arg_acknowledgeAbuse, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.File response) {
+      res
+          .get(arg_fileId,
+              acknowledgeAbuse: arg_acknowledgeAbuse,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_corpora = "foo";
@@ -2638,11 +2788,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("files"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("files"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -2655,31 +2808,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["corpora"].first, unittest.equals(arg_corpora));
+        unittest.expect(
+            queryMap["corpora"].first, unittest.equals(arg_corpora));
         unittest.expect(queryMap["corpus"].first, unittest.equals(arg_corpus));
-        unittest.expect(queryMap["includeTeamDriveItems"].first, unittest.equals("$arg_includeTeamDriveItems"));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["includeTeamDriveItems"].first,
+            unittest.equals("$arg_includeTeamDriveItems"));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["q"].first, unittest.equals(arg_q));
         unittest.expect(queryMap["spaces"].first, unittest.equals(arg_spaces));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(
+            queryMap["teamDriveId"].first, unittest.equals(arg_teamDriveId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFileList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(corpora: arg_corpora, corpus: arg_corpus, includeTeamDriveItems: arg_includeTeamDriveItems, orderBy: arg_orderBy, pageSize: arg_pageSize, pageToken: arg_pageToken, q: arg_q, spaces: arg_spaces, supportsTeamDrives: arg_supportsTeamDrives, teamDriveId: arg_teamDriveId).then(unittest.expectAsync1(((api.FileList response) {
+      res
+          .list(
+              corpora: arg_corpora,
+              corpus: arg_corpus,
+              includeTeamDriveItems: arg_includeTeamDriveItems,
+              orderBy: arg_orderBy,
+              pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
+              q: arg_q,
+              spaces: arg_spaces,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              teamDriveId: arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.FileList response) {
         checkFileList(response);
       })));
     });
@@ -2706,11 +2879,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2726,27 +2902,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["addParents"].first, unittest.equals(arg_addParents));
-        unittest.expect(queryMap["keepRevisionForever"].first, unittest.equals("$arg_keepRevisionForever"));
-        unittest.expect(queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
-        unittest.expect(queryMap["removeParents"].first, unittest.equals(arg_removeParents));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["useContentAsIndexableText"].first, unittest.equals("$arg_useContentAsIndexableText"));
-
+        unittest.expect(
+            queryMap["addParents"].first, unittest.equals(arg_addParents));
+        unittest.expect(queryMap["keepRevisionForever"].first,
+            unittest.equals("$arg_keepRevisionForever"));
+        unittest.expect(
+            queryMap["ocrLanguage"].first, unittest.equals(arg_ocrLanguage));
+        unittest.expect(queryMap["removeParents"].first,
+            unittest.equals(arg_removeParents));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["useContentAsIndexableText"].first,
+            unittest.equals("$arg_useContentAsIndexableText"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, addParents: arg_addParents, keepRevisionForever: arg_keepRevisionForever, ocrLanguage: arg_ocrLanguage, removeParents: arg_removeParents, supportsTeamDrives: arg_supportsTeamDrives, useContentAsIndexableText: arg_useContentAsIndexableText).then(unittest.expectAsync1(((api.File response) {
+      res
+          .update(arg_request, arg_fileId,
+              addParents: arg_addParents,
+              keepRevisionForever: arg_keepRevisionForever,
+              ocrLanguage: arg_ocrLanguage,
+              removeParents: arg_removeParents,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              useContentAsIndexableText: arg_useContentAsIndexableText)
+          .then(unittest.expectAsync1(((api.File response) {
         checkFile(response);
       })));
     });
@@ -2769,18 +2960,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/watch", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/watch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/watch"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2793,33 +2989,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["acknowledgeAbuse"].first, unittest.equals("$arg_acknowledgeAbuse"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["acknowledgeAbuse"].first,
+            unittest.equals("$arg_acknowledgeAbuse"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, arg_fileId, acknowledgeAbuse: arg_acknowledgeAbuse, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .watch(arg_request, arg_fileId,
+              acknowledgeAbuse: arg_acknowledgeAbuse,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PermissionsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_request = buildPermission();
@@ -2836,18 +3036,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/permissions"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -2860,31 +3065,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["emailMessage"].first, unittest.equals(arg_emailMessage));
-        unittest.expect(queryMap["sendNotificationEmail"].first, unittest.equals("$arg_sendNotificationEmail"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["transferOwnership"].first, unittest.equals("$arg_transferOwnership"));
-
+        unittest.expect(
+            queryMap["emailMessage"].first, unittest.equals(arg_emailMessage));
+        unittest.expect(queryMap["sendNotificationEmail"].first,
+            unittest.equals("$arg_sendNotificationEmail"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["transferOwnership"].first,
+            unittest.equals("$arg_transferOwnership"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_fileId, emailMessage: arg_emailMessage, sendNotificationEmail: arg_sendNotificationEmail, supportsTeamDrives: arg_supportsTeamDrives, transferOwnership: arg_transferOwnership).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .create(arg_request, arg_fileId,
+              emailMessage: arg_emailMessage,
+              sendNotificationEmail: arg_sendNotificationEmail,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              transferOwnership: arg_transferOwnership)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_fileId = "foo";
@@ -2895,18 +3110,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2922,26 +3142,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_permissionId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_permissionId,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_fileId = "foo";
@@ -2952,18 +3176,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2979,28 +3208,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_permissionId, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .get(arg_fileId, arg_permissionId,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_fileId = "foo";
@@ -3012,18 +3245,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/permissions"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -3036,30 +3274,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermissionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, pageSize: arg_pageSize, pageToken: arg_pageToken, supportsTeamDrives: arg_supportsTeamDrives).then(unittest.expectAsync1(((api.PermissionList response) {
+      res
+          .list(arg_fileId,
+              pageSize: arg_pageSize,
+              pageToken: arg_pageToken,
+              supportsTeamDrives: arg_supportsTeamDrives)
+          .then(unittest.expectAsync1(((api.PermissionList response) {
         checkPermissionList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.PermissionsResourceApi res = new api.DriveApi(mock).permissions;
       var arg_request = buildPermission();
@@ -3076,18 +3322,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/permissions/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3103,34 +3354,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["removeExpiration"].first, unittest.equals("$arg_removeExpiration"));
-        unittest.expect(queryMap["supportsTeamDrives"].first, unittest.equals("$arg_supportsTeamDrives"));
-        unittest.expect(queryMap["transferOwnership"].first, unittest.equals("$arg_transferOwnership"));
-
+        unittest.expect(queryMap["removeExpiration"].first,
+            unittest.equals("$arg_removeExpiration"));
+        unittest.expect(queryMap["supportsTeamDrives"].first,
+            unittest.equals("$arg_supportsTeamDrives"));
+        unittest.expect(queryMap["transferOwnership"].first,
+            unittest.equals("$arg_transferOwnership"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_permissionId, removeExpiration: arg_removeExpiration, supportsTeamDrives: arg_supportsTeamDrives, transferOwnership: arg_transferOwnership).then(unittest.expectAsync1(((api.Permission response) {
+      res
+          .update(arg_request, arg_fileId, arg_permissionId,
+              removeExpiration: arg_removeExpiration,
+              supportsTeamDrives: arg_supportsTeamDrives,
+              transferOwnership: arg_transferOwnership)
+          .then(unittest.expectAsync1(((api.Permission response) {
         checkPermission(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RepliesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_request = buildReply();
@@ -3144,25 +3401,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/replies"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/replies"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -3175,27 +3439,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_fileId, arg_commentId).then(unittest.expectAsync1(((api.Reply response) {
+      res
+          .create(arg_request, arg_fileId, arg_commentId)
+          .then(unittest.expectAsync1(((api.Reply response) {
         checkReply(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_fileId = "foo";
@@ -3206,25 +3472,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3240,25 +3513,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_commentId, arg_replyId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_commentId, arg_replyId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_fileId = "foo";
@@ -3270,25 +3545,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3304,28 +3586,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_commentId, arg_replyId, includeDeleted: arg_includeDeleted).then(unittest.expectAsync1(((api.Reply response) {
+      res
+          .get(arg_fileId, arg_commentId, arg_replyId,
+              includeDeleted: arg_includeDeleted)
+          .then(unittest.expectAsync1(((api.Reply response) {
         checkReply(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_fileId = "foo";
@@ -3338,25 +3624,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/replies"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/replies"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -3369,30 +3662,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReplyList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, arg_commentId, includeDeleted: arg_includeDeleted, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ReplyList response) {
+      res
+          .list(arg_fileId, arg_commentId,
+              includeDeleted: arg_includeDeleted,
+              pageSize: arg_pageSize,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ReplyList response) {
         checkReplyList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.RepliesResourceApi res = new api.DriveApi(mock).replies;
       var arg_request = buildReply();
@@ -3407,25 +3708,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/comments/"));
         pathOffset += 10;
         index = path.indexOf("/replies/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_commentId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replies/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/replies/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3441,31 +3749,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReply());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_commentId, arg_replyId).then(unittest.expectAsync1(((api.Reply response) {
+      res
+          .update(arg_request, arg_fileId, arg_commentId, arg_replyId)
+          .then(unittest.expectAsync1(((api.Reply response) {
         checkReply(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RevisionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_fileId = "foo";
@@ -3475,18 +3783,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3502,21 +3815,24 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_fileId, arg_revisionId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_fileId, arg_revisionId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
@@ -3533,18 +3849,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3560,28 +3881,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["acknowledgeAbuse"].first, unittest.equals("$arg_acknowledgeAbuse"));
-
+        unittest.expect(queryMap["acknowledgeAbuse"].first,
+            unittest.equals("$arg_acknowledgeAbuse"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevision());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, arg_revisionId, acknowledgeAbuse: arg_acknowledgeAbuse).then(unittest.expectAsync1(((api.Revision response) {
+      res
+          .get(arg_fileId, arg_revisionId,
+              acknowledgeAbuse: arg_acknowledgeAbuse)
+          .then(unittest.expectAsync1(((api.Revision response) {
         checkRevision(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_fileId = "foo";
@@ -3592,18 +3917,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/revisions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/revisions"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -3616,29 +3946,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevisionList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_fileId, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RevisionList response) {
+      res
+          .list(arg_fileId, pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RevisionList response) {
         checkRevisionList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.DriveApi(mock).revisions;
       var arg_request = buildRevision();
@@ -3652,18 +3986,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_fileId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/revisions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/revisions/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3679,31 +4018,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevision());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_fileId, arg_revisionId).then(unittest.expectAsync1(((api.Revision response) {
+      res
+          .update(arg_request, arg_fileId, arg_revisionId)
+          .then(unittest.expectAsync1(((api.Revision response) {
         checkRevision(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TeamdrivesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_request = buildTeamDrive();
@@ -3716,11 +4055,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("teamdrives"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("teamdrives"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -3733,28 +4075,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDrive());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_requestId).then(unittest.expectAsync1(((api.TeamDrive response) {
+      res
+          .create(arg_request, arg_requestId)
+          .then(unittest.expectAsync1(((api.TeamDrive response) {
         checkTeamDrive(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_teamDriveId = "foo";
@@ -3763,11 +4108,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("teamdrives/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("teamdrives/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3783,16 +4131,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3801,7 +4150,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_teamDriveId = "foo";
@@ -3810,11 +4158,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("teamdrives/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("teamdrives/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3830,27 +4181,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDrive());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_teamDriveId).then(unittest.expectAsync1(((api.TeamDrive response) {
+      res
+          .get(arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.TeamDrive response) {
         checkTeamDrive(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_pageSize = 42;
@@ -3860,11 +4213,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("teamdrives"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("teamdrives"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -3877,29 +4233,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDriveList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TeamDriveList response) {
+      res
+          .list(pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TeamDriveList response) {
         checkTeamDriveList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TeamdrivesResourceApi res = new api.DriveApi(mock).teamdrives;
       var arg_request = buildTeamDrive();
@@ -3912,11 +4272,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("drive/v3/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("teamdrives/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("teamdrives/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3932,27 +4295,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTeamDrive());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_teamDriveId).then(unittest.expectAsync1(((api.TeamDrive response) {
+      res
+          .update(arg_request, arg_teamDriveId)
+          .then(unittest.expectAsync1(((api.TeamDrive response) {
         checkTeamDrive(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
index 94c8131..bfcb846 100644
--- a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
+++ b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.firebasedynamiclinks.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/firebasedynamiclinks/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -120,14 +119,14 @@
   buildCounterCreateShortDynamicLinkRequest--;
 }
 
-buildUnnamed2192() {
+buildUnnamed2179() {
   var o = new core.List<api.DynamicLinkWarning>();
   o.add(buildDynamicLinkWarning());
   o.add(buildDynamicLinkWarning());
   return o;
 }
 
-checkUnnamed2192(core.List<api.DynamicLinkWarning> o) {
+checkUnnamed2179(core.List<api.DynamicLinkWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDynamicLinkWarning(o[0]);
   checkDynamicLinkWarning(o[1]);
@@ -140,7 +139,7 @@
   if (buildCounterCreateShortDynamicLinkResponse < 3) {
     o.previewLink = "foo";
     o.shortLink = "foo";
-    o.warning = buildUnnamed2192();
+    o.warning = buildUnnamed2179();
   }
   buildCounterCreateShortDynamicLinkResponse--;
   return o;
@@ -151,11 +150,38 @@
   if (buildCounterCreateShortDynamicLinkResponse < 3) {
     unittest.expect(o.previewLink, unittest.equals('foo'));
     unittest.expect(o.shortLink, unittest.equals('foo'));
-    checkUnnamed2192(o.warning);
+    checkUnnamed2179(o.warning);
   }
   buildCounterCreateShortDynamicLinkResponse--;
 }
 
+core.int buildCounterDeviceInfo = 0;
+buildDeviceInfo() {
+  var o = new api.DeviceInfo();
+  buildCounterDeviceInfo++;
+  if (buildCounterDeviceInfo < 3) {
+    o.deviceModelName = "foo";
+    o.languageCode = "foo";
+    o.screenResolutionHeight = "foo";
+    o.screenResolutionWidth = "foo";
+    o.timezone = "foo";
+  }
+  buildCounterDeviceInfo--;
+  return o;
+}
+
+checkDeviceInfo(api.DeviceInfo o) {
+  buildCounterDeviceInfo++;
+  if (buildCounterDeviceInfo < 3) {
+    unittest.expect(o.deviceModelName, unittest.equals('foo'));
+    unittest.expect(o.languageCode, unittest.equals('foo'));
+    unittest.expect(o.screenResolutionHeight, unittest.equals('foo'));
+    unittest.expect(o.screenResolutionWidth, unittest.equals('foo'));
+    unittest.expect(o.timezone, unittest.equals('foo'));
+  }
+  buildCounterDeviceInfo--;
+}
+
 core.int buildCounterDynamicLinkEventStat = 0;
 buildDynamicLinkEventStat() {
   var o = new api.DynamicLinkEventStat();
@@ -210,14 +236,14 @@
   buildCounterDynamicLinkInfo--;
 }
 
-buildUnnamed2193() {
+buildUnnamed2180() {
   var o = new core.List<api.DynamicLinkEventStat>();
   o.add(buildDynamicLinkEventStat());
   o.add(buildDynamicLinkEventStat());
   return o;
 }
 
-checkUnnamed2193(core.List<api.DynamicLinkEventStat> o) {
+checkUnnamed2180(core.List<api.DynamicLinkEventStat> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDynamicLinkEventStat(o[0]);
   checkDynamicLinkEventStat(o[1]);
@@ -228,7 +254,7 @@
   var o = new api.DynamicLinkStats();
   buildCounterDynamicLinkStats++;
   if (buildCounterDynamicLinkStats < 3) {
-    o.linkEventStats = buildUnnamed2193();
+    o.linkEventStats = buildUnnamed2180();
   }
   buildCounterDynamicLinkStats--;
   return o;
@@ -237,7 +263,7 @@
 checkDynamicLinkStats(api.DynamicLinkStats o) {
   buildCounterDynamicLinkStats++;
   if (buildCounterDynamicLinkStats < 3) {
-    checkUnnamed2193(o.linkEventStats);
+    checkUnnamed2180(o.linkEventStats);
   }
   buildCounterDynamicLinkStats--;
 }
@@ -265,6 +291,84 @@
   buildCounterDynamicLinkWarning--;
 }
 
+core.int buildCounterGetIosPostInstallAttributionRequest = 0;
+buildGetIosPostInstallAttributionRequest() {
+  var o = new api.GetIosPostInstallAttributionRequest();
+  buildCounterGetIosPostInstallAttributionRequest++;
+  if (buildCounterGetIosPostInstallAttributionRequest < 3) {
+    o.appInstallationTime = "foo";
+    o.bundleId = "foo";
+    o.device = buildDeviceInfo();
+    o.iosVersion = "foo";
+    o.retrievalMethod = "foo";
+    o.sdkVersion = "foo";
+    o.uniqueMatchLinkToCheck = "foo";
+    o.visualStyle = "foo";
+  }
+  buildCounterGetIosPostInstallAttributionRequest--;
+  return o;
+}
+
+checkGetIosPostInstallAttributionRequest(
+    api.GetIosPostInstallAttributionRequest o) {
+  buildCounterGetIosPostInstallAttributionRequest++;
+  if (buildCounterGetIosPostInstallAttributionRequest < 3) {
+    unittest.expect(o.appInstallationTime, unittest.equals('foo'));
+    unittest.expect(o.bundleId, unittest.equals('foo'));
+    checkDeviceInfo(o.device);
+    unittest.expect(o.iosVersion, unittest.equals('foo'));
+    unittest.expect(o.retrievalMethod, unittest.equals('foo'));
+    unittest.expect(o.sdkVersion, unittest.equals('foo'));
+    unittest.expect(o.uniqueMatchLinkToCheck, unittest.equals('foo'));
+    unittest.expect(o.visualStyle, unittest.equals('foo'));
+  }
+  buildCounterGetIosPostInstallAttributionRequest--;
+}
+
+core.int buildCounterGetIosPostInstallAttributionResponse = 0;
+buildGetIosPostInstallAttributionResponse() {
+  var o = new api.GetIosPostInstallAttributionResponse();
+  buildCounterGetIosPostInstallAttributionResponse++;
+  if (buildCounterGetIosPostInstallAttributionResponse < 3) {
+    o.appMinimumVersion = "foo";
+    o.attributionConfidence = "foo";
+    o.deepLink = "foo";
+    o.externalBrowserDestinationLink = "foo";
+    o.fallbackLink = "foo";
+    o.invitationId = "foo";
+    o.isStrongMatchExecutable = true;
+    o.matchMessage = "foo";
+    o.requestedLink = "foo";
+    o.resolvedLink = "foo";
+    o.utmCampaign = "foo";
+    o.utmMedium = "foo";
+    o.utmSource = "foo";
+  }
+  buildCounterGetIosPostInstallAttributionResponse--;
+  return o;
+}
+
+checkGetIosPostInstallAttributionResponse(
+    api.GetIosPostInstallAttributionResponse o) {
+  buildCounterGetIosPostInstallAttributionResponse++;
+  if (buildCounterGetIosPostInstallAttributionResponse < 3) {
+    unittest.expect(o.appMinimumVersion, unittest.equals('foo'));
+    unittest.expect(o.attributionConfidence, unittest.equals('foo'));
+    unittest.expect(o.deepLink, unittest.equals('foo'));
+    unittest.expect(o.externalBrowserDestinationLink, unittest.equals('foo'));
+    unittest.expect(o.fallbackLink, unittest.equals('foo'));
+    unittest.expect(o.invitationId, unittest.equals('foo'));
+    unittest.expect(o.isStrongMatchExecutable, unittest.isTrue);
+    unittest.expect(o.matchMessage, unittest.equals('foo'));
+    unittest.expect(o.requestedLink, unittest.equals('foo'));
+    unittest.expect(o.resolvedLink, unittest.equals('foo'));
+    unittest.expect(o.utmCampaign, unittest.equals('foo'));
+    unittest.expect(o.utmMedium, unittest.equals('foo'));
+    unittest.expect(o.utmSource, unittest.equals('foo'));
+  }
+  buildCounterGetIosPostInstallAttributionResponse--;
+}
+
 core.int buildCounterGooglePlayAnalytics = 0;
 buildGooglePlayAnalytics() {
   var o = new api.GooglePlayAnalytics();
@@ -409,7 +513,6 @@
   buildCounterSuffix--;
 }
 
-
 main() {
   unittest.group("obj-schema-AnalyticsInfo", () {
     unittest.test("to-json--from-json", () {
@@ -419,7 +522,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AndroidInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildAndroidInfo();
@@ -428,7 +530,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateShortDynamicLinkRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateShortDynamicLinkRequest();
@@ -437,7 +538,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateShortDynamicLinkResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateShortDynamicLinkResponse();
@@ -446,6 +546,13 @@
     });
   });
 
+  unittest.group("obj-schema-DeviceInfo", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDeviceInfo();
+      var od = new api.DeviceInfo.fromJson(o.toJson());
+      checkDeviceInfo(od);
+    });
+  });
 
   unittest.group("obj-schema-DynamicLinkEventStat", () {
     unittest.test("to-json--from-json", () {
@@ -455,7 +562,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DynamicLinkInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildDynamicLinkInfo();
@@ -464,7 +570,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DynamicLinkStats", () {
     unittest.test("to-json--from-json", () {
       var o = buildDynamicLinkStats();
@@ -473,7 +578,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DynamicLinkWarning", () {
     unittest.test("to-json--from-json", () {
       var o = buildDynamicLinkWarning();
@@ -482,6 +586,22 @@
     });
   });
 
+  unittest.group("obj-schema-GetIosPostInstallAttributionRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGetIosPostInstallAttributionRequest();
+      var od = new api.GetIosPostInstallAttributionRequest.fromJson(o.toJson());
+      checkGetIosPostInstallAttributionRequest(od);
+    });
+  });
+
+  unittest.group("obj-schema-GetIosPostInstallAttributionResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildGetIosPostInstallAttributionResponse();
+      var od =
+          new api.GetIosPostInstallAttributionResponse.fromJson(o.toJson());
+      checkGetIosPostInstallAttributionResponse(od);
+    });
+  });
 
   unittest.group("obj-schema-GooglePlayAnalytics", () {
     unittest.test("to-json--from-json", () {
@@ -491,7 +611,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ITunesConnectAnalytics", () {
     unittest.test("to-json--from-json", () {
       var o = buildITunesConnectAnalytics();
@@ -500,7 +619,6 @@
     });
   });
 
-
   unittest.group("obj-schema-IosInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildIosInfo();
@@ -509,7 +627,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NavigationInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildNavigationInfo();
@@ -518,7 +635,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SocialMetaTagInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSocialMetaTagInfo();
@@ -527,7 +643,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Suffix", () {
     unittest.test("to-json--from-json", () {
       var o = buildSuffix();
@@ -536,12 +651,11 @@
     });
   });
 
-
   unittest.group("resource-ShortLinksResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ShortLinksResourceApi res = new api.FirebasedynamiclinksApi(mock).shortLinks;
+      api.ShortLinksResourceApi res =
+          new api.FirebasedynamiclinksApi(mock).shortLinks;
       var arg_request = buildCreateShortDynamicLinkRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.CreateShortDynamicLinkRequest.fromJson(json);
@@ -551,9 +665,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("v1/shortLinks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("v1/shortLinks"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -566,31 +682,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCreateShortDynamicLinkResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.CreateShortDynamicLinkResponse response) {
+      res.create(arg_request).then(
+          unittest.expectAsync1(((api.CreateShortDynamicLinkResponse response) {
         checkCreateShortDynamicLinkResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-V1ResourceApi", () {
     unittest.test("method--getLinkStats", () {
-
       var mock = new HttpServerMock();
       api.V1ResourceApi res = new api.FirebasedynamiclinksApi(mock).v1;
       var arg_dynamicLink = "foo";
@@ -600,16 +715,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         index = path.indexOf("/linkStats", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_dynamicLink"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/linkStats"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/linkStats"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -622,28 +741,79 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["durationDays"].first, unittest.equals(arg_durationDays));
-
+        unittest.expect(
+            queryMap["durationDays"].first, unittest.equals(arg_durationDays));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDynamicLinkStats());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getLinkStats(arg_dynamicLink, durationDays: arg_durationDays).then(unittest.expectAsync1(((api.DynamicLinkStats response) {
+      res
+          .getLinkStats(arg_dynamicLink, durationDays: arg_durationDays)
+          .then(unittest.expectAsync1(((api.DynamicLinkStats response) {
         checkDynamicLinkStats(response);
       })));
     });
 
+    unittest.test("method--installAttribution", () {
+      var mock = new HttpServerMock();
+      api.V1ResourceApi res = new api.FirebasedynamiclinksApi(mock).v1;
+      var arg_request = buildGetIosPostInstallAttributionRequest();
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.GetIosPostInstallAttributionRequest.fromJson(json);
+        checkGetIosPostInstallAttributionRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("v1/installAttribution"));
+        pathOffset += 21;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp =
+            convert.JSON.encode(buildGetIosPostInstallAttributionResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.installAttribution(arg_request).then(unittest
+          .expectAsync1(((api.GetIosPostInstallAttributionResponse response) {
+        checkGetIosPostInstallAttributionResponse(response);
+      })));
+    });
   });
-
-
 }
-
diff --git a/generated/googleapis/test/firebaseremoteconfig/v1_test.dart b/generated/googleapis/test/firebaseremoteconfig/v1_test.dart
new file mode 100644
index 0000000..52aa5d9
--- /dev/null
+++ b/generated/googleapis/test/firebaseremoteconfig/v1_test.dart
@@ -0,0 +1,320 @@
+library googleapis.firebaseremoteconfig.v1.test;
+
+import "dart:core" as core;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import 'package:http/http.dart' as http;
+import 'package:test/test.dart' as unittest;
+
+import 'package:googleapis/firebaseremoteconfig/v1.dart' as api;
+
+class HttpServerMock extends http.BaseClient {
+  core.Function _callback;
+  core.bool _expectJson;
+
+  void register(core.Function callback, core.bool expectJson) {
+    _callback = callback;
+    _expectJson = expectJson;
+  }
+
+  async.Future<http.StreamedResponse> send(http.BaseRequest request) {
+    if (_expectJson) {
+      return request
+          .finalize()
+          .transform(convert.UTF8.decoder)
+          .join('')
+          .then((core.String jsonString) {
+        if (jsonString.isEmpty) {
+          return _callback(request, null);
+        } else {
+          return _callback(request, convert.JSON.decode(jsonString));
+        }
+      });
+    } else {
+      var stream = request.finalize();
+      if (stream == null) {
+        return _callback(request, []);
+      } else {
+        return stream.toBytes().then((data) {
+          return _callback(request, data);
+        });
+      }
+    }
+  }
+}
+
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
+  var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
+  return new http.StreamedResponse(stream, status, headers: headers);
+}
+
+buildUnnamed758() {
+  var o = new core.List<api.RemoteConfigCondition>();
+  o.add(buildRemoteConfigCondition());
+  o.add(buildRemoteConfigCondition());
+  return o;
+}
+
+checkUnnamed758(core.List<api.RemoteConfigCondition> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRemoteConfigCondition(o[0]);
+  checkRemoteConfigCondition(o[1]);
+}
+
+buildUnnamed759() {
+  var o = new core.Map<core.String, api.RemoteConfigParameter>();
+  o["x"] = buildRemoteConfigParameter();
+  o["y"] = buildRemoteConfigParameter();
+  return o;
+}
+
+checkUnnamed759(core.Map<core.String, api.RemoteConfigParameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRemoteConfigParameter(o["x"]);
+  checkRemoteConfigParameter(o["y"]);
+}
+
+core.int buildCounterRemoteConfig = 0;
+buildRemoteConfig() {
+  var o = new api.RemoteConfig();
+  buildCounterRemoteConfig++;
+  if (buildCounterRemoteConfig < 3) {
+    o.conditions = buildUnnamed758();
+    o.parameters = buildUnnamed759();
+  }
+  buildCounterRemoteConfig--;
+  return o;
+}
+
+checkRemoteConfig(api.RemoteConfig o) {
+  buildCounterRemoteConfig++;
+  if (buildCounterRemoteConfig < 3) {
+    checkUnnamed758(o.conditions);
+    checkUnnamed759(o.parameters);
+  }
+  buildCounterRemoteConfig--;
+}
+
+core.int buildCounterRemoteConfigCondition = 0;
+buildRemoteConfigCondition() {
+  var o = new api.RemoteConfigCondition();
+  buildCounterRemoteConfigCondition++;
+  if (buildCounterRemoteConfigCondition < 3) {
+    o.expression = "foo";
+    o.name = "foo";
+    o.tagColor = "foo";
+  }
+  buildCounterRemoteConfigCondition--;
+  return o;
+}
+
+checkRemoteConfigCondition(api.RemoteConfigCondition o) {
+  buildCounterRemoteConfigCondition++;
+  if (buildCounterRemoteConfigCondition < 3) {
+    unittest.expect(o.expression, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.tagColor, unittest.equals('foo'));
+  }
+  buildCounterRemoteConfigCondition--;
+}
+
+buildUnnamed760() {
+  var o = new core.Map<core.String, api.RemoteConfigParameterValue>();
+  o["x"] = buildRemoteConfigParameterValue();
+  o["y"] = buildRemoteConfigParameterValue();
+  return o;
+}
+
+checkUnnamed760(core.Map<core.String, api.RemoteConfigParameterValue> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRemoteConfigParameterValue(o["x"]);
+  checkRemoteConfigParameterValue(o["y"]);
+}
+
+core.int buildCounterRemoteConfigParameter = 0;
+buildRemoteConfigParameter() {
+  var o = new api.RemoteConfigParameter();
+  buildCounterRemoteConfigParameter++;
+  if (buildCounterRemoteConfigParameter < 3) {
+    o.conditionalValues = buildUnnamed760();
+    o.defaultValue = buildRemoteConfigParameterValue();
+  }
+  buildCounterRemoteConfigParameter--;
+  return o;
+}
+
+checkRemoteConfigParameter(api.RemoteConfigParameter o) {
+  buildCounterRemoteConfigParameter++;
+  if (buildCounterRemoteConfigParameter < 3) {
+    checkUnnamed760(o.conditionalValues);
+    checkRemoteConfigParameterValue(o.defaultValue);
+  }
+  buildCounterRemoteConfigParameter--;
+}
+
+core.int buildCounterRemoteConfigParameterValue = 0;
+buildRemoteConfigParameterValue() {
+  var o = new api.RemoteConfigParameterValue();
+  buildCounterRemoteConfigParameterValue++;
+  if (buildCounterRemoteConfigParameterValue < 3) {
+    o.useInAppDefault = true;
+    o.value = "foo";
+  }
+  buildCounterRemoteConfigParameterValue--;
+  return o;
+}
+
+checkRemoteConfigParameterValue(api.RemoteConfigParameterValue o) {
+  buildCounterRemoteConfigParameterValue++;
+  if (buildCounterRemoteConfigParameterValue < 3) {
+    unittest.expect(o.useInAppDefault, unittest.isTrue);
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterRemoteConfigParameterValue--;
+}
+
+main() {
+  unittest.group("obj-schema-RemoteConfig", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRemoteConfig();
+      var od = new api.RemoteConfig.fromJson(o.toJson());
+      checkRemoteConfig(od);
+    });
+  });
+
+  unittest.group("obj-schema-RemoteConfigCondition", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRemoteConfigCondition();
+      var od = new api.RemoteConfigCondition.fromJson(o.toJson());
+      checkRemoteConfigCondition(od);
+    });
+  });
+
+  unittest.group("obj-schema-RemoteConfigParameter", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRemoteConfigParameter();
+      var od = new api.RemoteConfigParameter.fromJson(o.toJson());
+      checkRemoteConfigParameter(od);
+    });
+  });
+
+  unittest.group("obj-schema-RemoteConfigParameterValue", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRemoteConfigParameterValue();
+      var od = new api.RemoteConfigParameterValue.fromJson(o.toJson());
+      checkRemoteConfigParameterValue(od);
+    });
+  });
+
+  unittest.group("resource-ProjectsResourceApi", () {
+    unittest.test("method--getRemoteConfig", () {
+      var mock = new HttpServerMock();
+      api.ProjectsResourceApi res =
+          new api.FirebaseremoteconfigApi(mock).projects;
+      var arg_project = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildRemoteConfig());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .getRemoteConfig(arg_project)
+          .then(unittest.expectAsync1(((api.RemoteConfig response) {
+        checkRemoteConfig(response);
+      })));
+    });
+
+    unittest.test("method--updateRemoteConfig", () {
+      var mock = new HttpServerMock();
+      api.ProjectsResourceApi res =
+          new api.FirebaseremoteconfigApi(mock).projects;
+      var arg_request = buildRemoteConfig();
+      var arg_project = "foo";
+      var arg_validateOnly = true;
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.RemoteConfig.fromJson(json);
+        checkRemoteConfig(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(queryMap["validateOnly"].first,
+            unittest.equals("$arg_validateOnly"));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildRemoteConfig());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .updateRemoteConfig(arg_request, arg_project,
+              validateOnly: arg_validateOnly)
+          .then(unittest.expectAsync1(((api.RemoteConfig response) {
+        checkRemoteConfig(response);
+      })));
+    });
+  });
+}
diff --git a/generated/googleapis/test/firebaserules/v1_test.dart b/generated/googleapis/test/firebaserules/v1_test.dart
index a77366d..9650191 100644
--- a/generated/googleapis/test/firebaserules/v1_test.dart
+++ b/generated/googleapis/test/firebaserules/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.firebaserules.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/firebaserules/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -57,7 +56,11 @@
   buildCounterArg++;
   if (buildCounterArg < 3) {
     o.anyValue = buildEmpty();
-    o.exactValue = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.exactValue = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
   }
   buildCounterArg--;
   return o;
@@ -67,7 +70,11 @@
   buildCounterArg++;
   if (buildCounterArg < 3) {
     checkEmpty(o.anyValue);
-    var casted1 = (o.exactValue) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
+    var casted1 = (o.exactValue) as core.Map;
+    unittest.expect(casted1, unittest.hasLength(3));
+    unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted1["bool"], unittest.equals(true));
+    unittest.expect(casted1["string"], unittest.equals('foo'));
   }
   buildCounterArg--;
 }
@@ -76,16 +83,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -112,17 +117,33 @@
   buildCounterFile--;
 }
 
-buildUnnamed3079() {
+buildUnnamed3072() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed3079(core.List<core.Object> o) {
+checkUnnamed3072(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted2 = (o[0]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
-  var casted3 = (o[1]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
+  var casted2 = (o[0]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
+  var casted3 = (o[1]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterFunctionCall = 0;
@@ -130,7 +151,7 @@
   var o = new api.FunctionCall();
   buildCounterFunctionCall++;
   if (buildCounterFunctionCall < 3) {
-    o.args = buildUnnamed3079();
+    o.args = buildUnnamed3072();
     o.function = "foo";
   }
   buildCounterFunctionCall--;
@@ -140,20 +161,20 @@
 checkFunctionCall(api.FunctionCall o) {
   buildCounterFunctionCall++;
   if (buildCounterFunctionCall < 3) {
-    checkUnnamed3079(o.args);
+    checkUnnamed3072(o.args);
     unittest.expect(o.function, unittest.equals('foo'));
   }
   buildCounterFunctionCall--;
 }
 
-buildUnnamed3080() {
+buildUnnamed3073() {
   var o = new core.List<api.Arg>();
   o.add(buildArg());
   o.add(buildArg());
   return o;
 }
 
-checkUnnamed3080(core.List<api.Arg> o) {
+checkUnnamed3073(core.List<api.Arg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkArg(o[0]);
   checkArg(o[1]);
@@ -164,7 +185,7 @@
   var o = new api.FunctionMock();
   buildCounterFunctionMock++;
   if (buildCounterFunctionMock < 3) {
-    o.args = buildUnnamed3080();
+    o.args = buildUnnamed3073();
     o.function = "foo";
     o.result = buildResult();
   }
@@ -175,7 +196,7 @@
 checkFunctionMock(api.FunctionMock o) {
   buildCounterFunctionMock++;
   if (buildCounterFunctionMock < 3) {
-    checkUnnamed3080(o.args);
+    checkUnnamed3073(o.args);
     unittest.expect(o.function, unittest.equals('foo'));
     checkResult(o.result);
   }
@@ -205,14 +226,14 @@
   buildCounterIssue--;
 }
 
-buildUnnamed3081() {
+buildUnnamed3074() {
   var o = new core.List<api.Release>();
   o.add(buildRelease());
   o.add(buildRelease());
   return o;
 }
 
-checkUnnamed3081(core.List<api.Release> o) {
+checkUnnamed3074(core.List<api.Release> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRelease(o[0]);
   checkRelease(o[1]);
@@ -224,7 +245,7 @@
   buildCounterListReleasesResponse++;
   if (buildCounterListReleasesResponse < 3) {
     o.nextPageToken = "foo";
-    o.releases = buildUnnamed3081();
+    o.releases = buildUnnamed3074();
   }
   buildCounterListReleasesResponse--;
   return o;
@@ -234,19 +255,19 @@
   buildCounterListReleasesResponse++;
   if (buildCounterListReleasesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3081(o.releases);
+    checkUnnamed3074(o.releases);
   }
   buildCounterListReleasesResponse--;
 }
 
-buildUnnamed3082() {
+buildUnnamed3075() {
   var o = new core.List<api.Ruleset>();
   o.add(buildRuleset());
   o.add(buildRuleset());
   return o;
 }
 
-checkUnnamed3082(core.List<api.Ruleset> o) {
+checkUnnamed3075(core.List<api.Ruleset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRuleset(o[0]);
   checkRuleset(o[1]);
@@ -258,7 +279,7 @@
   buildCounterListRulesetsResponse++;
   if (buildCounterListRulesetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.rulesets = buildUnnamed3082();
+    o.rulesets = buildUnnamed3075();
   }
   buildCounterListRulesetsResponse--;
   return o;
@@ -268,7 +289,7 @@
   buildCounterListRulesetsResponse++;
   if (buildCounterListRulesetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed3082(o.rulesets);
+    checkUnnamed3075(o.rulesets);
   }
   buildCounterListRulesetsResponse--;
 }
@@ -304,7 +325,11 @@
   buildCounterResult++;
   if (buildCounterResult < 3) {
     o.undefined = buildEmpty();
-    o.value = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.value = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
   }
   buildCounterResult--;
   return o;
@@ -314,7 +339,11 @@
   buildCounterResult++;
   if (buildCounterResult < 3) {
     checkEmpty(o.undefined);
-    var casted4 = (o.value) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+    var casted4 = (o.value) as core.Map;
+    unittest.expect(casted4, unittest.hasLength(3));
+    unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted4["bool"], unittest.equals(true));
+    unittest.expect(casted4["string"], unittest.equals('foo'));
   }
   buildCounterResult--;
 }
@@ -342,14 +371,14 @@
   buildCounterRuleset--;
 }
 
-buildUnnamed3083() {
+buildUnnamed3076() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed3083(core.List<api.File> o) {
+checkUnnamed3076(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -360,7 +389,7 @@
   var o = new api.Source();
   buildCounterSource++;
   if (buildCounterSource < 3) {
-    o.files = buildUnnamed3083();
+    o.files = buildUnnamed3076();
   }
   buildCounterSource--;
   return o;
@@ -369,7 +398,7 @@
 checkSource(api.Source o) {
   buildCounterSource++;
   if (buildCounterSource < 3) {
-    checkUnnamed3083(o.files);
+    checkUnnamed3076(o.files);
   }
   buildCounterSource--;
 }
@@ -397,14 +426,14 @@
   buildCounterSourcePosition--;
 }
 
-buildUnnamed3084() {
+buildUnnamed3077() {
   var o = new core.List<api.FunctionMock>();
   o.add(buildFunctionMock());
   o.add(buildFunctionMock());
   return o;
 }
 
-checkUnnamed3084(core.List<api.FunctionMock> o) {
+checkUnnamed3077(core.List<api.FunctionMock> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFunctionMock(o[0]);
   checkFunctionMock(o[1]);
@@ -416,9 +445,17 @@
   buildCounterTestCase++;
   if (buildCounterTestCase < 3) {
     o.expectation = "foo";
-    o.functionMocks = buildUnnamed3084();
-    o.request = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-    o.resource = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.functionMocks = buildUnnamed3077();
+    o.request = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
+    o.resource = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
   }
   buildCounterTestCase--;
   return o;
@@ -428,34 +465,42 @@
   buildCounterTestCase++;
   if (buildCounterTestCase < 3) {
     unittest.expect(o.expectation, unittest.equals('foo'));
-    checkUnnamed3084(o.functionMocks);
-    var casted5 = (o.request) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-    var casted6 = (o.resource) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+    checkUnnamed3077(o.functionMocks);
+    var casted5 = (o.request) as core.Map;
+    unittest.expect(casted5, unittest.hasLength(3));
+    unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted5["bool"], unittest.equals(true));
+    unittest.expect(casted5["string"], unittest.equals('foo'));
+    var casted6 = (o.resource) as core.Map;
+    unittest.expect(casted6, unittest.hasLength(3));
+    unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted6["bool"], unittest.equals(true));
+    unittest.expect(casted6["string"], unittest.equals('foo'));
   }
   buildCounterTestCase--;
 }
 
-buildUnnamed3085() {
+buildUnnamed3078() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed3085(core.List<core.String> o) {
+checkUnnamed3078(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed3086() {
+buildUnnamed3079() {
   var o = new core.List<api.FunctionCall>();
   o.add(buildFunctionCall());
   o.add(buildFunctionCall());
   return o;
 }
 
-checkUnnamed3086(core.List<api.FunctionCall> o) {
+checkUnnamed3079(core.List<api.FunctionCall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFunctionCall(o[0]);
   checkFunctionCall(o[1]);
@@ -466,9 +511,9 @@
   var o = new api.TestResult();
   buildCounterTestResult++;
   if (buildCounterTestResult < 3) {
-    o.debugMessages = buildUnnamed3085();
+    o.debugMessages = buildUnnamed3078();
     o.errorPosition = buildSourcePosition();
-    o.functionCalls = buildUnnamed3086();
+    o.functionCalls = buildUnnamed3079();
     o.state = "foo";
   }
   buildCounterTestResult--;
@@ -478,9 +523,9 @@
 checkTestResult(api.TestResult o) {
   buildCounterTestResult++;
   if (buildCounterTestResult < 3) {
-    checkUnnamed3085(o.debugMessages);
+    checkUnnamed3078(o.debugMessages);
     checkSourcePosition(o.errorPosition);
-    checkUnnamed3086(o.functionCalls);
+    checkUnnamed3079(o.functionCalls);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterTestResult--;
@@ -507,27 +552,27 @@
   buildCounterTestRulesetRequest--;
 }
 
-buildUnnamed3087() {
+buildUnnamed3080() {
   var o = new core.List<api.Issue>();
   o.add(buildIssue());
   o.add(buildIssue());
   return o;
 }
 
-checkUnnamed3087(core.List<api.Issue> o) {
+checkUnnamed3080(core.List<api.Issue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIssue(o[0]);
   checkIssue(o[1]);
 }
 
-buildUnnamed3088() {
+buildUnnamed3081() {
   var o = new core.List<api.TestResult>();
   o.add(buildTestResult());
   o.add(buildTestResult());
   return o;
 }
 
-checkUnnamed3088(core.List<api.TestResult> o) {
+checkUnnamed3081(core.List<api.TestResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestResult(o[0]);
   checkTestResult(o[1]);
@@ -538,8 +583,8 @@
   var o = new api.TestRulesetResponse();
   buildCounterTestRulesetResponse++;
   if (buildCounterTestRulesetResponse < 3) {
-    o.issues = buildUnnamed3087();
-    o.testResults = buildUnnamed3088();
+    o.issues = buildUnnamed3080();
+    o.testResults = buildUnnamed3081();
   }
   buildCounterTestRulesetResponse--;
   return o;
@@ -548,20 +593,20 @@
 checkTestRulesetResponse(api.TestRulesetResponse o) {
   buildCounterTestRulesetResponse++;
   if (buildCounterTestRulesetResponse < 3) {
-    checkUnnamed3087(o.issues);
-    checkUnnamed3088(o.testResults);
+    checkUnnamed3080(o.issues);
+    checkUnnamed3081(o.testResults);
   }
   buildCounterTestRulesetResponse--;
 }
 
-buildUnnamed3089() {
+buildUnnamed3082() {
   var o = new core.List<api.TestCase>();
   o.add(buildTestCase());
   o.add(buildTestCase());
   return o;
 }
 
-checkUnnamed3089(core.List<api.TestCase> o) {
+checkUnnamed3082(core.List<api.TestCase> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestCase(o[0]);
   checkTestCase(o[1]);
@@ -572,7 +617,7 @@
   var o = new api.TestSuite();
   buildCounterTestSuite++;
   if (buildCounterTestSuite < 3) {
-    o.testCases = buildUnnamed3089();
+    o.testCases = buildUnnamed3082();
   }
   buildCounterTestSuite--;
   return o;
@@ -581,12 +626,11 @@
 checkTestSuite(api.TestSuite o) {
   buildCounterTestSuite++;
   if (buildCounterTestSuite < 3) {
-    checkUnnamed3089(o.testCases);
+    checkUnnamed3082(o.testCases);
   }
   buildCounterTestSuite--;
 }
 
-
 main() {
   unittest.group("obj-schema-Arg", () {
     unittest.test("to-json--from-json", () {
@@ -596,7 +640,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -605,7 +648,6 @@
     });
   });
 
-
   unittest.group("obj-schema-File", () {
     unittest.test("to-json--from-json", () {
       var o = buildFile();
@@ -614,7 +656,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FunctionCall", () {
     unittest.test("to-json--from-json", () {
       var o = buildFunctionCall();
@@ -623,7 +664,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FunctionMock", () {
     unittest.test("to-json--from-json", () {
       var o = buildFunctionMock();
@@ -632,7 +672,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Issue", () {
     unittest.test("to-json--from-json", () {
       var o = buildIssue();
@@ -641,7 +680,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListReleasesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListReleasesResponse();
@@ -650,7 +688,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListRulesetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListRulesetsResponse();
@@ -659,7 +696,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Release", () {
     unittest.test("to-json--from-json", () {
       var o = buildRelease();
@@ -668,7 +704,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Result", () {
     unittest.test("to-json--from-json", () {
       var o = buildResult();
@@ -677,7 +712,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Ruleset", () {
     unittest.test("to-json--from-json", () {
       var o = buildRuleset();
@@ -686,7 +720,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Source", () {
     unittest.test("to-json--from-json", () {
       var o = buildSource();
@@ -695,7 +728,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourcePosition", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourcePosition();
@@ -704,7 +736,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestCase", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestCase();
@@ -713,7 +744,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestResult();
@@ -722,7 +752,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestRulesetRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestRulesetRequest();
@@ -731,7 +760,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestRulesetResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestRulesetResponse();
@@ -740,7 +768,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestSuite", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestSuite();
@@ -749,10 +776,8 @@
     });
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--test", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.FirebaserulesApi(mock).projects;
       var arg_request = buildTestRulesetRequest();
@@ -765,9 +790,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -781,33 +808,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestRulesetResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.test(arg_request, arg_name).then(unittest.expectAsync1(((api.TestRulesetResponse response) {
+      res
+          .test(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.TestRulesetResponse response) {
         checkTestRulesetResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsReleasesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReleasesResourceApi res = new api.FirebaserulesApi(mock).projects.releases;
+      api.ProjectsReleasesResourceApi res =
+          new api.FirebaserulesApi(mock).projects.releases;
       var arg_request = buildRelease();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -818,9 +846,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -834,38 +864,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRelease());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_name).then(unittest.expectAsync1(((api.Release response) {
+      res
+          .create(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Release response) {
         checkRelease(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReleasesResourceApi res = new api.FirebaserulesApi(mock).projects.releases;
+      api.ProjectsReleasesResourceApi res =
+          new api.FirebaserulesApi(mock).projects.releases;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -879,16 +914,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -899,18 +935,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReleasesResourceApi res = new api.FirebaserulesApi(mock).projects.releases;
+      api.ProjectsReleasesResourceApi res =
+          new api.FirebaserulesApi(mock).projects.releases;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -924,16 +962,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRelease());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -944,9 +983,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReleasesResourceApi res = new api.FirebaserulesApi(mock).projects.releases;
+      api.ProjectsReleasesResourceApi res =
+          new api.FirebaserulesApi(mock).projects.releases;
       var arg_name = "foo";
       var arg_filter = "foo";
       var arg_pageToken = "foo";
@@ -956,9 +995,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -972,32 +1013,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListReleasesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListReleasesResponse response) {
+      res
+          .list(arg_name,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListReleasesResponse response) {
         checkListReleasesResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReleasesResourceApi res = new api.FirebaserulesApi(mock).projects.releases;
+      api.ProjectsReleasesResourceApi res =
+          new api.FirebaserulesApi(mock).projects.releases;
       var arg_request = buildRelease();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1008,9 +1057,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1024,33 +1075,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRelease());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_name).then(unittest.expectAsync1(((api.Release response) {
+      res
+          .update(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Release response) {
         checkRelease(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsRulesetsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRulesetsResourceApi res = new api.FirebaserulesApi(mock).projects.rulesets;
+      api.ProjectsRulesetsResourceApi res =
+          new api.FirebaserulesApi(mock).projects.rulesets;
       var arg_request = buildRuleset();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1061,9 +1113,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1077,38 +1131,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRuleset());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_name).then(unittest.expectAsync1(((api.Ruleset response) {
+      res
+          .create(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Ruleset response) {
         checkRuleset(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRulesetsResourceApi res = new api.FirebaserulesApi(mock).projects.rulesets;
+      api.ProjectsRulesetsResourceApi res =
+          new api.FirebaserulesApi(mock).projects.rulesets;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1122,16 +1181,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1142,18 +1202,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRulesetsResourceApi res = new api.FirebaserulesApi(mock).projects.rulesets;
+      api.ProjectsRulesetsResourceApi res =
+          new api.FirebaserulesApi(mock).projects.rulesets;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1167,16 +1229,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRuleset());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1187,21 +1250,23 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsRulesetsResourceApi res = new api.FirebaserulesApi(mock).projects.rulesets;
+      api.ProjectsRulesetsResourceApi res =
+          new api.FirebaserulesApi(mock).projects.rulesets;
       var arg_name = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1215,30 +1280,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListRulesetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListRulesetsResponse response) {
+      res
+          .list(arg_name,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListRulesetsResponse response) {
         checkListRulesetsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/fusiontables/v1_test.dart b/generated/googleapis/test/fusiontables/v1_test.dart
index 82c9ac8..9bb2266 100644
--- a/generated/googleapis/test/fusiontables/v1_test.dart
+++ b/generated/googleapis/test/fusiontables/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.fusiontables.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/fusiontables/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -132,14 +131,14 @@
   buildCounterColumn--;
 }
 
-buildUnnamed2661() {
+buildUnnamed2648() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed2661(core.List<api.Column> o) {
+checkUnnamed2648(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -150,7 +149,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed2661();
+    o.items = buildUnnamed2648();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -162,7 +161,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed2661(o.items);
+    checkUnnamed2648(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -170,17 +169,33 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed2662() {
+buildUnnamed2649() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2662(core.List<core.Object> o) {
+checkUnnamed2649(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterGeometry = 0;
@@ -188,8 +203,12 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed2662();
-    o.geometry = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.geometries = buildUnnamed2649();
+    o.geometry = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.type = "foo";
   }
   buildCounterGeometry--;
@@ -199,8 +218,12 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed2662(o.geometries);
-    var casted3 = (o.geometry) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
+    checkUnnamed2649(o.geometries);
+    var casted3 = (o.geometry) as core.Map;
+    unittest.expect(casted3, unittest.hasLength(3));
+    unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted3["bool"], unittest.equals(true));
+    unittest.expect(casted3["string"], unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGeometry--;
@@ -227,30 +250,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed2663() {
+buildUnnamed2650() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed2663(core.List<core.double> o) {
+checkUnnamed2650(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed2664() {
+buildUnnamed2651() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed2663());
-  o.add(buildUnnamed2663());
+  o.add(buildUnnamed2650());
+  o.add(buildUnnamed2650());
   return o;
 }
 
-checkUnnamed2664(core.List<core.List<core.double>> o) {
+checkUnnamed2651(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2663(o[0]);
-  checkUnnamed2663(o[1]);
+  checkUnnamed2650(o[0]);
+  checkUnnamed2650(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -258,7 +281,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed2664();
+    o.coordinates = buildUnnamed2651();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -268,7 +291,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed2664(o.coordinates);
+    checkUnnamed2651(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -301,14 +324,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed2665() {
+buildUnnamed2652() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed2665(core.List<core.double> o) {
+checkUnnamed2652(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -319,7 +342,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed2665();
+    o.coordinates = buildUnnamed2652();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -329,7 +352,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed2665(o.coordinates);
+    checkUnnamed2652(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -356,43 +379,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed2666() {
+buildUnnamed2653() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed2666(core.List<core.double> o) {
+checkUnnamed2653(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed2667() {
+buildUnnamed2654() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed2666());
-  o.add(buildUnnamed2666());
+  o.add(buildUnnamed2653());
+  o.add(buildUnnamed2653());
   return o;
 }
 
-checkUnnamed2667(core.List<core.List<core.double>> o) {
+checkUnnamed2654(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2666(o[0]);
-  checkUnnamed2666(o[1]);
+  checkUnnamed2653(o[0]);
+  checkUnnamed2653(o[1]);
 }
 
-buildUnnamed2668() {
+buildUnnamed2655() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed2667());
-  o.add(buildUnnamed2667());
+  o.add(buildUnnamed2654());
+  o.add(buildUnnamed2654());
   return o;
 }
 
-checkUnnamed2668(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed2655(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2667(o[0]);
-  checkUnnamed2667(o[1]);
+  checkUnnamed2654(o[0]);
+  checkUnnamed2654(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -400,7 +423,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed2668();
+    o.coordinates = buildUnnamed2655();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -410,7 +433,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed2668(o.coordinates);
+    checkUnnamed2655(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -449,43 +472,59 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed2669() {
+buildUnnamed2656() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2669(core.List<core.String> o) {
+checkUnnamed2656(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2670() {
+buildUnnamed2657() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2670(core.List<core.Object> o) {
+checkUnnamed2657(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted4 = (o[0]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
-  var casted5 = (o[1]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
+  var casted4 = (o[0]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
+  var casted5 = (o[1]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2671() {
+buildUnnamed2658() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2670());
-  o.add(buildUnnamed2670());
+  o.add(buildUnnamed2657());
+  o.add(buildUnnamed2657());
   return o;
 }
 
-checkUnnamed2671(core.List<core.List<core.Object>> o) {
+checkUnnamed2658(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2670(o[0]);
-  checkUnnamed2670(o[1]);
+  checkUnnamed2657(o[0]);
+  checkUnnamed2657(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -493,9 +532,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed2669();
+    o.columns = buildUnnamed2656();
     o.kind = "foo";
-    o.rows = buildUnnamed2671();
+    o.rows = buildUnnamed2658();
   }
   buildCounterSqlresponse--;
   return o;
@@ -504,21 +543,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed2669(o.columns);
+    checkUnnamed2656(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2671(o.rows);
+    checkUnnamed2658(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed2672() {
+buildUnnamed2659() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed2672(core.List<api.Bucket> o) {
+checkUnnamed2659(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -545,14 +584,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed2673() {
+buildUnnamed2660() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed2673(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed2660(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -563,7 +602,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed2673();
+    o.colors = buildUnnamed2660();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -574,7 +613,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed2673(o.colors);
+    checkUnnamed2660(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -586,7 +625,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed2672();
+    o.buckets = buildUnnamed2659();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -598,7 +637,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed2672(o.buckets);
+    checkUnnamed2659(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -637,14 +676,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed2674() {
+buildUnnamed2661() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed2674(core.List<api.StyleSetting> o) {
+checkUnnamed2661(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -655,7 +694,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed2674();
+    o.items = buildUnnamed2661();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -667,7 +706,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed2674(o.items);
+    checkUnnamed2661(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -675,27 +714,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed2675() {
+buildUnnamed2662() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2675(core.List<core.String> o) {
+checkUnnamed2662(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2676() {
+buildUnnamed2663() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed2676(core.List<api.Column> o) {
+checkUnnamed2663(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -708,8 +747,8 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed2675();
-    o.columns = buildUnnamed2676();
+    o.baseTableIds = buildUnnamed2662();
+    o.columns = buildUnnamed2663();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -726,8 +765,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed2675(o.baseTableIds);
-    checkUnnamed2676(o.columns);
+    checkUnnamed2662(o.baseTableIds);
+    checkUnnamed2663(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -738,14 +777,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed2677() {
+buildUnnamed2664() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed2677(core.List<api.Table> o) {
+checkUnnamed2664(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -756,7 +795,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed2677();
+    o.items = buildUnnamed2664();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -767,7 +806,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed2677(o.items);
+    checkUnnamed2664(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -801,14 +840,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed2678() {
+buildUnnamed2665() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed2678(core.List<api.Task> o) {
+checkUnnamed2665(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -819,7 +858,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed2678();
+    o.items = buildUnnamed2665();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -831,7 +870,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed2678(o.items);
+    checkUnnamed2665(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -839,14 +878,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed2679() {
+buildUnnamed2666() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2679(core.List<core.String> o) {
+checkUnnamed2666(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -857,7 +896,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed2679();
+    o.automaticColumnNames = buildUnnamed2666();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -871,7 +910,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed2679(o.automaticColumnNames);
+    checkUnnamed2666(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -881,14 +920,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed2680() {
+buildUnnamed2667() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed2680(core.List<api.Template> o) {
+checkUnnamed2667(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -899,7 +938,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed2680();
+    o.items = buildUnnamed2667();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -911,7 +950,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed2680(o.items);
+    checkUnnamed2667(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -919,7 +958,6 @@
   buildCounterTemplateList--;
 }
 
-
 main() {
   unittest.group("obj-schema-Bucket", () {
     unittest.test("to-json--from-json", () {
@@ -929,7 +967,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColumnBaseColumn", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumnBaseColumn();
@@ -938,7 +975,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Column", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumn();
@@ -947,7 +983,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColumnList", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumnList();
@@ -956,7 +991,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Geometry", () {
     unittest.test("to-json--from-json", () {
       var o = buildGeometry();
@@ -965,7 +999,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Import", () {
     unittest.test("to-json--from-json", () {
       var o = buildImport();
@@ -974,7 +1007,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Line", () {
     unittest.test("to-json--from-json", () {
       var o = buildLine();
@@ -983,7 +1015,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LineStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildLineStyle();
@@ -992,7 +1023,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Point", () {
     unittest.test("to-json--from-json", () {
       var o = buildPoint();
@@ -1001,7 +1031,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PointStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildPointStyle();
@@ -1010,7 +1039,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Polygon", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolygon();
@@ -1019,7 +1047,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PolygonStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolygonStyle();
@@ -1028,7 +1055,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Sqlresponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSqlresponse();
@@ -1037,7 +1063,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleFunctionGradientColors", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleFunctionGradientColors();
@@ -1046,7 +1071,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleFunctionGradient", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleFunctionGradient();
@@ -1055,7 +1079,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleFunction", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleFunction();
@@ -1064,7 +1087,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleSetting", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleSetting();
@@ -1073,7 +1095,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleSettingList", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleSettingList();
@@ -1082,7 +1103,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Table", () {
     unittest.test("to-json--from-json", () {
       var o = buildTable();
@@ -1091,7 +1111,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableList();
@@ -1100,7 +1119,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Task", () {
     unittest.test("to-json--from-json", () {
       var o = buildTask();
@@ -1109,7 +1127,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TaskList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTaskList();
@@ -1118,7 +1135,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Template", () {
     unittest.test("to-json--from-json", () {
       var o = buildTemplate();
@@ -1127,7 +1143,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TemplateList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTemplateList();
@@ -1136,10 +1151,8 @@
     });
   });
 
-
   unittest.group("resource-ColumnResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_tableId = "foo";
@@ -1149,18 +1162,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1176,16 +1194,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1194,7 +1213,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_tableId = "foo";
@@ -1204,18 +1222,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1231,27 +1254,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_columnId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .get(arg_tableId, arg_columnId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_request = buildColumn();
@@ -1264,18 +1289,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/columns"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/columns"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1288,27 +1318,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tableId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .insert(arg_request, arg_tableId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_tableId = "foo";
@@ -1319,18 +1351,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/columns"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/columns"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1343,29 +1380,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumnList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ColumnList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ColumnList response) {
         checkColumnList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_request = buildColumn();
@@ -1379,18 +1421,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1406,27 +1453,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, arg_columnId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .patch(arg_request, arg_tableId, arg_columnId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_request = buildColumn();
@@ -1440,18 +1489,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1467,28 +1521,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, arg_columnId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .update(arg_request, arg_tableId, arg_columnId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-QueryResourceApi", () {
     unittest.test("method--sql", () {
       // TODO: Implement tests for media upload;
@@ -1504,11 +1559,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("query"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1521,24 +1579,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["sql"].first, unittest.equals(arg_sql_1));
         unittest.expect(queryMap["hdrs"].first, unittest.equals("$arg_hdrs"));
         unittest.expect(queryMap["typed"].first, unittest.equals("$arg_typed"));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSqlresponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.sql(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed).then(unittest.expectAsync1(((api.Sqlresponse response) {
+      res
+          .sql(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed)
+          .then(unittest.expectAsync1(((api.Sqlresponse response) {
         checkSqlresponse(response);
       })));
     });
@@ -1557,11 +1618,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("query"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1574,34 +1638,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["sql"].first, unittest.equals(arg_sql_1));
         unittest.expect(queryMap["hdrs"].first, unittest.equals("$arg_hdrs"));
         unittest.expect(queryMap["typed"].first, unittest.equals("$arg_typed"));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSqlresponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.sqlGet(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed).then(unittest.expectAsync1(((api.Sqlresponse response) {
+      res
+          .sqlGet(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed)
+          .then(unittest.expectAsync1(((api.Sqlresponse response) {
         checkSqlresponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-StyleResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_tableId = "foo";
@@ -1611,18 +1675,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1638,16 +1707,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1656,7 +1726,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_tableId = "foo";
@@ -1666,18 +1735,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1693,27 +1767,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_styleId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .get(arg_tableId, arg_styleId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_request = buildStyleSetting();
@@ -1726,18 +1802,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/styles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/styles"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1750,27 +1831,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tableId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .insert(arg_request, arg_tableId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_tableId = "foo";
@@ -1781,18 +1864,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/styles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/styles"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1805,29 +1893,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSettingList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.StyleSettingList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.StyleSettingList response) {
         checkStyleSettingList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_request = buildStyleSetting();
@@ -1841,18 +1934,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1868,27 +1966,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, arg_styleId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .patch(arg_request, arg_tableId, arg_styleId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_request = buildStyleSetting();
@@ -1902,18 +2002,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1929,31 +2034,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, arg_styleId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .update(arg_request, arg_tableId, arg_styleId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TableResourceApi", () {
     unittest.test("method--copy", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_tableId = "foo";
@@ -1963,18 +2068,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/copy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/copy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/copy"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1987,28 +2097,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["copyPresentation"].first, unittest.equals("$arg_copyPresentation"));
-
+        unittest.expect(queryMap["copyPresentation"].first,
+            unittest.equals("$arg_copyPresentation"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.copy(arg_tableId, copyPresentation: arg_copyPresentation).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .copy(arg_tableId, copyPresentation: arg_copyPresentation)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_tableId = "foo";
@@ -2017,11 +2130,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2037,16 +2153,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2055,7 +2172,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_tableId = "foo";
@@ -2064,11 +2180,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2084,16 +2203,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2120,18 +2240,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/import", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/import"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/import"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2144,26 +2269,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["delimiter"].first, unittest.equals(arg_delimiter));
-        unittest.expect(queryMap["encoding"].first, unittest.equals(arg_encoding));
-        unittest.expect(core.int.parse(queryMap["endLine"].first), unittest.equals(arg_endLine));
-        unittest.expect(queryMap["isStrict"].first, unittest.equals("$arg_isStrict"));
-        unittest.expect(core.int.parse(queryMap["startLine"].first), unittest.equals(arg_startLine));
-
+        unittest.expect(
+            queryMap["delimiter"].first, unittest.equals(arg_delimiter));
+        unittest.expect(
+            queryMap["encoding"].first, unittest.equals(arg_encoding));
+        unittest.expect(core.int.parse(queryMap["endLine"].first),
+            unittest.equals(arg_endLine));
+        unittest.expect(
+            queryMap["isStrict"].first, unittest.equals("$arg_isStrict"));
+        unittest.expect(core.int.parse(queryMap["startLine"].first),
+            unittest.equals(arg_startLine));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.importRows(arg_tableId, delimiter: arg_delimiter, encoding: arg_encoding, endLine: arg_endLine, isStrict: arg_isStrict, startLine: arg_startLine).then(unittest.expectAsync1(((api.Import response) {
+      res
+          .importRows(arg_tableId,
+              delimiter: arg_delimiter,
+              encoding: arg_encoding,
+              endLine: arg_endLine,
+              isStrict: arg_isStrict,
+              startLine: arg_startLine)
+          .then(unittest.expectAsync1(((api.Import response) {
         checkImport(response);
       })));
     });
@@ -2182,11 +2320,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("tables/import"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("tables/import"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -2199,30 +2340,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-        unittest.expect(queryMap["delimiter"].first, unittest.equals(arg_delimiter));
-        unittest.expect(queryMap["encoding"].first, unittest.equals(arg_encoding));
-
+        unittest.expect(
+            queryMap["delimiter"].first, unittest.equals(arg_delimiter));
+        unittest.expect(
+            queryMap["encoding"].first, unittest.equals(arg_encoding));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.importTable(arg_name, delimiter: arg_delimiter, encoding: arg_encoding).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .importTable(arg_name,
+              delimiter: arg_delimiter, encoding: arg_encoding)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_request = buildTable();
@@ -2234,11 +2380,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("tables"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2251,16 +2400,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2271,7 +2421,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_maxResults = 42;
@@ -2281,11 +2430,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("tables"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2298,29 +2450,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTableList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TableList response) {
+      res
+          .list(maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TableList response) {
         checkTableList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_request = buildTable();
@@ -2334,11 +2490,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2354,28 +2513,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["replaceViewDefinition"].first, unittest.equals("$arg_replaceViewDefinition"));
-
+        unittest.expect(queryMap["replaceViewDefinition"].first,
+            unittest.equals("$arg_replaceViewDefinition"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, replaceViewDefinition: arg_replaceViewDefinition).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .patch(arg_request, arg_tableId,
+              replaceViewDefinition: arg_replaceViewDefinition)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_request = buildTable();
@@ -2389,11 +2552,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2409,32 +2575,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["replaceViewDefinition"].first, unittest.equals("$arg_replaceViewDefinition"));
-
+        unittest.expect(queryMap["replaceViewDefinition"].first,
+            unittest.equals("$arg_replaceViewDefinition"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, replaceViewDefinition: arg_replaceViewDefinition).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .update(arg_request, arg_tableId,
+              replaceViewDefinition: arg_replaceViewDefinition)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TaskResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TaskResourceApi res = new api.FusiontablesApi(mock).task;
       var arg_tableId = "foo";
@@ -2444,18 +2612,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2471,16 +2644,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2489,7 +2663,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TaskResourceApi res = new api.FusiontablesApi(mock).task;
       var arg_tableId = "foo";
@@ -2499,18 +2672,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2526,27 +2704,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_taskId).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .get(arg_tableId, arg_taskId)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TaskResourceApi res = new api.FusiontablesApi(mock).task;
       var arg_tableId = "foo";
@@ -2558,18 +2738,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tasks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/tasks"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2582,34 +2767,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken, startIndex: arg_startIndex).then(unittest.expectAsync1(((api.TaskList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              startIndex: arg_startIndex)
+          .then(unittest.expectAsync1(((api.TaskList response) {
         checkTaskList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TemplateResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_tableId = "foo";
@@ -2619,18 +2810,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2646,25 +2842,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_tableId, arg_templateId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_tableId = "foo";
@@ -2674,18 +2872,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2701,27 +2904,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_templateId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .get(arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_request = buildTemplate();
@@ -2734,18 +2939,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/templates"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/templates"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2758,27 +2968,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tableId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .insert(arg_request, arg_tableId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_tableId = "foo";
@@ -2789,18 +3001,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/templates"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/templates"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2813,29 +3030,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplateList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TemplateList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TemplateList response) {
         checkTemplateList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_request = buildTemplate();
@@ -2849,18 +3071,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2876,27 +3103,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, arg_templateId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .patch(arg_request, arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_request = buildTemplate();
@@ -2910,18 +3139,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2937,27 +3171,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, arg_templateId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .update(arg_request, arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/fusiontables/v2_test.dart b/generated/googleapis/test/fusiontables/v2_test.dart
index 42f6bb5..19b0aa2 100644
--- a/generated/googleapis/test/fusiontables/v2_test.dart
+++ b/generated/googleapis/test/fusiontables/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.fusiontables.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/fusiontables/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -101,14 +100,14 @@
   buildCounterColumnBaseColumn--;
 }
 
-buildUnnamed475() {
+buildUnnamed474() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed475(core.List<core.String> o) {
+checkUnnamed474(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -129,7 +128,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.type = "foo";
-    o.validValues = buildUnnamed475();
+    o.validValues = buildUnnamed474();
     o.validateData = true;
   }
   buildCounterColumn--;
@@ -149,20 +148,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUnnamed475(o.validValues);
+    checkUnnamed474(o.validValues);
     unittest.expect(o.validateData, unittest.isTrue);
   }
   buildCounterColumn--;
 }
 
-buildUnnamed476() {
+buildUnnamed475() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed476(core.List<api.Column> o) {
+checkUnnamed475(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -173,7 +172,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed476();
+    o.items = buildUnnamed475();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -185,7 +184,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed476(o.items);
+    checkUnnamed475(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -193,17 +192,33 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed477() {
+buildUnnamed476() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed477(core.List<core.Object> o) {
+checkUnnamed476(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterGeometry = 0;
@@ -211,8 +226,12 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed477();
-    o.geometry = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.geometries = buildUnnamed476();
+    o.geometry = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.type = "foo";
   }
   buildCounterGeometry--;
@@ -222,8 +241,12 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed477(o.geometries);
-    var casted3 = (o.geometry) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
+    checkUnnamed476(o.geometries);
+    var casted3 = (o.geometry) as core.Map;
+    unittest.expect(casted3, unittest.hasLength(3));
+    unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted3["bool"], unittest.equals(true));
+    unittest.expect(casted3["string"], unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGeometry--;
@@ -250,30 +273,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed478() {
+buildUnnamed477() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed478(core.List<core.double> o) {
+checkUnnamed477(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed479() {
+buildUnnamed478() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed478());
-  o.add(buildUnnamed478());
+  o.add(buildUnnamed477());
+  o.add(buildUnnamed477());
   return o;
 }
 
-checkUnnamed479(core.List<core.List<core.double>> o) {
+checkUnnamed478(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed478(o[0]);
-  checkUnnamed478(o[1]);
+  checkUnnamed477(o[0]);
+  checkUnnamed477(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -281,7 +304,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed479();
+    o.coordinates = buildUnnamed478();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -291,7 +314,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed479(o.coordinates);
+    checkUnnamed478(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -324,14 +347,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed480() {
+buildUnnamed479() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed480(core.List<core.double> o) {
+checkUnnamed479(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -342,7 +365,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed480();
+    o.coordinates = buildUnnamed479();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -352,7 +375,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed480(o.coordinates);
+    checkUnnamed479(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -379,51 +402,51 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed481() {
+buildUnnamed480() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed481(core.List<core.double> o) {
+checkUnnamed480(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed482() {
+buildUnnamed481() {
   var o = new core.List<core.List<core.double>>();
+  o.add(buildUnnamed480());
+  o.add(buildUnnamed480());
+  return o;
+}
+
+checkUnnamed481(core.List<core.List<core.double>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed480(o[0]);
+  checkUnnamed480(o[1]);
+}
+
+buildUnnamed482() {
+  var o = new core.List<core.List<core.List<core.double>>>();
   o.add(buildUnnamed481());
   o.add(buildUnnamed481());
   return o;
 }
 
-checkUnnamed482(core.List<core.List<core.double>> o) {
+checkUnnamed482(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnnamed481(o[0]);
   checkUnnamed481(o[1]);
 }
 
-buildUnnamed483() {
-  var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed482());
-  o.add(buildUnnamed482());
-  return o;
-}
-
-checkUnnamed483(core.List<core.List<core.List<core.double>>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed482(o[0]);
-  checkUnnamed482(o[1]);
-}
-
 core.int buildCounterPolygon = 0;
 buildPolygon() {
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed483();
+    o.coordinates = buildUnnamed482();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -433,7 +456,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed483(o.coordinates);
+    checkUnnamed482(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -472,43 +495,59 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed484() {
+buildUnnamed483() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed484(core.List<core.String> o) {
+checkUnnamed483(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed485() {
+buildUnnamed484() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed485(core.List<core.Object> o) {
+checkUnnamed484(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted4 = (o[0]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
-  var casted5 = (o[1]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
+  var casted4 = (o[0]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
+  var casted5 = (o[1]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
 }
 
-buildUnnamed486() {
+buildUnnamed485() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed485());
-  o.add(buildUnnamed485());
+  o.add(buildUnnamed484());
+  o.add(buildUnnamed484());
   return o;
 }
 
-checkUnnamed486(core.List<core.List<core.Object>> o) {
+checkUnnamed485(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed485(o[0]);
-  checkUnnamed485(o[1]);
+  checkUnnamed484(o[0]);
+  checkUnnamed484(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -516,9 +555,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed484();
+    o.columns = buildUnnamed483();
     o.kind = "foo";
-    o.rows = buildUnnamed486();
+    o.rows = buildUnnamed485();
   }
   buildCounterSqlresponse--;
   return o;
@@ -527,21 +566,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed484(o.columns);
+    checkUnnamed483(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed486(o.rows);
+    checkUnnamed485(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed487() {
+buildUnnamed486() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed487(core.List<api.Bucket> o) {
+checkUnnamed486(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -568,14 +607,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed488() {
+buildUnnamed487() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed488(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed487(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -586,7 +625,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed488();
+    o.colors = buildUnnamed487();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -597,7 +636,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed488(o.colors);
+    checkUnnamed487(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -609,7 +648,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed487();
+    o.buckets = buildUnnamed486();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -621,7 +660,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed487(o.buckets);
+    checkUnnamed486(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -660,14 +699,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed489() {
+buildUnnamed488() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed489(core.List<api.StyleSetting> o) {
+checkUnnamed488(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -678,7 +717,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed489();
+    o.items = buildUnnamed488();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -690,7 +729,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed489(o.items);
+    checkUnnamed488(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -698,27 +737,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed490() {
+buildUnnamed489() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed490(core.List<core.String> o) {
+checkUnnamed489(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed491() {
+buildUnnamed490() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed491(core.List<api.Column> o) {
+checkUnnamed490(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -731,9 +770,9 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed490();
+    o.baseTableIds = buildUnnamed489();
     o.columnPropertiesJsonSchema = "foo";
-    o.columns = buildUnnamed491();
+    o.columns = buildUnnamed490();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -752,9 +791,9 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed490(o.baseTableIds);
+    checkUnnamed489(o.baseTableIds);
     unittest.expect(o.columnPropertiesJsonSchema, unittest.equals('foo'));
-    checkUnnamed491(o.columns);
+    checkUnnamed490(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -767,14 +806,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed492() {
+buildUnnamed491() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed492(core.List<api.Table> o) {
+checkUnnamed491(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -785,7 +824,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed492();
+    o.items = buildUnnamed491();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -796,7 +835,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed492(o.items);
+    checkUnnamed491(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -830,14 +869,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed493() {
+buildUnnamed492() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed493(core.List<api.Task> o) {
+checkUnnamed492(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -848,7 +887,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed493();
+    o.items = buildUnnamed492();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -860,7 +899,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed493(o.items);
+    checkUnnamed492(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -868,14 +907,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed494() {
+buildUnnamed493() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed494(core.List<core.String> o) {
+checkUnnamed493(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -886,7 +925,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed494();
+    o.automaticColumnNames = buildUnnamed493();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -900,7 +939,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed494(o.automaticColumnNames);
+    checkUnnamed493(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -910,14 +949,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed495() {
+buildUnnamed494() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed495(core.List<api.Template> o) {
+checkUnnamed494(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -928,7 +967,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed495();
+    o.items = buildUnnamed494();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -940,7 +979,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed495(o.items);
+    checkUnnamed494(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -948,7 +987,6 @@
   buildCounterTemplateList--;
 }
 
-
 main() {
   unittest.group("obj-schema-Bucket", () {
     unittest.test("to-json--from-json", () {
@@ -958,7 +996,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColumnBaseColumn", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumnBaseColumn();
@@ -967,7 +1004,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Column", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumn();
@@ -976,7 +1012,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColumnList", () {
     unittest.test("to-json--from-json", () {
       var o = buildColumnList();
@@ -985,7 +1020,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Geometry", () {
     unittest.test("to-json--from-json", () {
       var o = buildGeometry();
@@ -994,7 +1028,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Import", () {
     unittest.test("to-json--from-json", () {
       var o = buildImport();
@@ -1003,7 +1036,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Line", () {
     unittest.test("to-json--from-json", () {
       var o = buildLine();
@@ -1012,7 +1044,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LineStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildLineStyle();
@@ -1021,7 +1052,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Point", () {
     unittest.test("to-json--from-json", () {
       var o = buildPoint();
@@ -1030,7 +1060,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PointStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildPointStyle();
@@ -1039,7 +1068,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Polygon", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolygon();
@@ -1048,7 +1076,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PolygonStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolygonStyle();
@@ -1057,7 +1084,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Sqlresponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSqlresponse();
@@ -1066,7 +1092,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleFunctionGradientColors", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleFunctionGradientColors();
@@ -1075,7 +1100,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleFunctionGradient", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleFunctionGradient();
@@ -1084,7 +1108,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleFunction", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleFunction();
@@ -1093,7 +1116,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleSetting", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleSetting();
@@ -1102,7 +1124,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StyleSettingList", () {
     unittest.test("to-json--from-json", () {
       var o = buildStyleSettingList();
@@ -1111,7 +1132,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Table", () {
     unittest.test("to-json--from-json", () {
       var o = buildTable();
@@ -1120,7 +1140,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableList();
@@ -1129,7 +1148,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Task", () {
     unittest.test("to-json--from-json", () {
       var o = buildTask();
@@ -1138,7 +1156,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TaskList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTaskList();
@@ -1147,7 +1164,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Template", () {
     unittest.test("to-json--from-json", () {
       var o = buildTemplate();
@@ -1156,7 +1172,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TemplateList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTemplateList();
@@ -1165,10 +1180,8 @@
     });
   });
 
-
   unittest.group("resource-ColumnResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_tableId = "foo";
@@ -1178,18 +1191,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1205,16 +1223,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1223,7 +1242,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_tableId = "foo";
@@ -1233,18 +1251,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1260,27 +1283,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_columnId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .get(arg_tableId, arg_columnId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_request = buildColumn();
@@ -1293,18 +1318,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/columns"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/columns"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1317,27 +1347,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tableId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .insert(arg_request, arg_tableId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_tableId = "foo";
@@ -1348,18 +1380,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/columns"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/columns"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1372,29 +1409,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumnList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ColumnList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ColumnList response) {
         checkColumnList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_request = buildColumn();
@@ -1408,18 +1450,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1435,27 +1482,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, arg_columnId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .patch(arg_request, arg_tableId, arg_columnId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.ColumnResourceApi res = new api.FusiontablesApi(mock).column;
       var arg_request = buildColumn();
@@ -1469,18 +1518,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/columns/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/columns/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1496,28 +1550,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildColumn());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, arg_columnId).then(unittest.expectAsync1(((api.Column response) {
+      res
+          .update(arg_request, arg_tableId, arg_columnId)
+          .then(unittest.expectAsync1(((api.Column response) {
         checkColumn(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-QueryResourceApi", () {
     unittest.test("method--sql", () {
       // TODO: Implement tests for media upload;
@@ -1533,11 +1588,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("query"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1550,24 +1608,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["sql"].first, unittest.equals(arg_sql_1));
         unittest.expect(queryMap["hdrs"].first, unittest.equals("$arg_hdrs"));
         unittest.expect(queryMap["typed"].first, unittest.equals("$arg_typed"));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSqlresponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.sql(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed).then(unittest.expectAsync1(((api.Sqlresponse response) {
+      res
+          .sql(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed)
+          .then(unittest.expectAsync1(((api.Sqlresponse response) {
         checkSqlresponse(response);
       })));
     });
@@ -1586,11 +1647,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("query"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1603,34 +1667,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["sql"].first, unittest.equals(arg_sql_1));
         unittest.expect(queryMap["hdrs"].first, unittest.equals("$arg_hdrs"));
         unittest.expect(queryMap["typed"].first, unittest.equals("$arg_typed"));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSqlresponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.sqlGet(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed).then(unittest.expectAsync1(((api.Sqlresponse response) {
+      res
+          .sqlGet(arg_sql_1, hdrs: arg_hdrs, typed: arg_typed)
+          .then(unittest.expectAsync1(((api.Sqlresponse response) {
         checkSqlresponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-StyleResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_tableId = "foo";
@@ -1640,18 +1704,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1667,16 +1736,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1685,7 +1755,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_tableId = "foo";
@@ -1695,18 +1764,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1722,27 +1796,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_styleId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .get(arg_tableId, arg_styleId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_request = buildStyleSetting();
@@ -1755,18 +1831,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/styles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/styles"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1779,27 +1860,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tableId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .insert(arg_request, arg_tableId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_tableId = "foo";
@@ -1810,18 +1893,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/styles"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/styles"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1834,29 +1922,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSettingList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.StyleSettingList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.StyleSettingList response) {
         checkStyleSettingList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_request = buildStyleSetting();
@@ -1870,18 +1963,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1897,27 +1995,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, arg_styleId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .patch(arg_request, arg_tableId, arg_styleId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.StyleResourceApi res = new api.FusiontablesApi(mock).style;
       var arg_request = buildStyleSetting();
@@ -1931,18 +2031,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/styles/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/styles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1958,31 +2063,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStyleSetting());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, arg_styleId).then(unittest.expectAsync1(((api.StyleSetting response) {
+      res
+          .update(arg_request, arg_tableId, arg_styleId)
+          .then(unittest.expectAsync1(((api.StyleSetting response) {
         checkStyleSetting(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TableResourceApi", () {
     unittest.test("method--copy", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_tableId = "foo";
@@ -1992,18 +2097,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/copy", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/copy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/copy"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -2016,28 +2126,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["copyPresentation"].first, unittest.equals("$arg_copyPresentation"));
-
+        unittest.expect(queryMap["copyPresentation"].first,
+            unittest.equals("$arg_copyPresentation"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.copy(arg_tableId, copyPresentation: arg_copyPresentation).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .copy(arg_tableId, copyPresentation: arg_copyPresentation)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_tableId = "foo";
@@ -2046,11 +2159,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2066,16 +2182,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2084,7 +2201,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_tableId = "foo";
@@ -2093,11 +2209,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2113,16 +2232,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2149,18 +2269,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/import", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/import"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/import"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -2173,26 +2298,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["delimiter"].first, unittest.equals(arg_delimiter));
-        unittest.expect(queryMap["encoding"].first, unittest.equals(arg_encoding));
-        unittest.expect(core.int.parse(queryMap["endLine"].first), unittest.equals(arg_endLine));
-        unittest.expect(queryMap["isStrict"].first, unittest.equals("$arg_isStrict"));
-        unittest.expect(core.int.parse(queryMap["startLine"].first), unittest.equals(arg_startLine));
-
+        unittest.expect(
+            queryMap["delimiter"].first, unittest.equals(arg_delimiter));
+        unittest.expect(
+            queryMap["encoding"].first, unittest.equals(arg_encoding));
+        unittest.expect(core.int.parse(queryMap["endLine"].first),
+            unittest.equals(arg_endLine));
+        unittest.expect(
+            queryMap["isStrict"].first, unittest.equals("$arg_isStrict"));
+        unittest.expect(core.int.parse(queryMap["startLine"].first),
+            unittest.equals(arg_startLine));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.importRows(arg_tableId, delimiter: arg_delimiter, encoding: arg_encoding, endLine: arg_endLine, isStrict: arg_isStrict, startLine: arg_startLine).then(unittest.expectAsync1(((api.Import response) {
+      res
+          .importRows(arg_tableId,
+              delimiter: arg_delimiter,
+              encoding: arg_encoding,
+              endLine: arg_endLine,
+              isStrict: arg_isStrict,
+              startLine: arg_startLine)
+          .then(unittest.expectAsync1(((api.Import response) {
         checkImport(response);
       })));
     });
@@ -2211,11 +2349,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("tables/import"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("tables/import"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -2228,30 +2369,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-        unittest.expect(queryMap["delimiter"].first, unittest.equals(arg_delimiter));
-        unittest.expect(queryMap["encoding"].first, unittest.equals(arg_encoding));
-
+        unittest.expect(
+            queryMap["delimiter"].first, unittest.equals(arg_delimiter));
+        unittest.expect(
+            queryMap["encoding"].first, unittest.equals(arg_encoding));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.importTable(arg_name, delimiter: arg_delimiter, encoding: arg_encoding).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .importTable(arg_name,
+              delimiter: arg_delimiter, encoding: arg_encoding)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_request = buildTable();
@@ -2263,11 +2409,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("tables"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2280,16 +2429,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2300,7 +2450,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_maxResults = 42;
@@ -2310,11 +2459,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("tables"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2327,29 +2479,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTableList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TableList response) {
+      res
+          .list(maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TableList response) {
         checkTableList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_request = buildTable();
@@ -2363,11 +2519,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2383,22 +2542,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["replaceViewDefinition"].first, unittest.equals("$arg_replaceViewDefinition"));
-
+        unittest.expect(queryMap["replaceViewDefinition"].first,
+            unittest.equals("$arg_replaceViewDefinition"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, replaceViewDefinition: arg_replaceViewDefinition).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .patch(arg_request, arg_tableId,
+              replaceViewDefinition: arg_replaceViewDefinition)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
@@ -2420,18 +2584,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/replace", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/replace"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/replace"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -2444,32 +2613,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["delimiter"].first, unittest.equals(arg_delimiter));
-        unittest.expect(queryMap["encoding"].first, unittest.equals(arg_encoding));
-        unittest.expect(core.int.parse(queryMap["endLine"].first), unittest.equals(arg_endLine));
-        unittest.expect(queryMap["isStrict"].first, unittest.equals("$arg_isStrict"));
-        unittest.expect(core.int.parse(queryMap["startLine"].first), unittest.equals(arg_startLine));
-
+        unittest.expect(
+            queryMap["delimiter"].first, unittest.equals(arg_delimiter));
+        unittest.expect(
+            queryMap["encoding"].first, unittest.equals(arg_encoding));
+        unittest.expect(core.int.parse(queryMap["endLine"].first),
+            unittest.equals(arg_endLine));
+        unittest.expect(
+            queryMap["isStrict"].first, unittest.equals("$arg_isStrict"));
+        unittest.expect(core.int.parse(queryMap["startLine"].first),
+            unittest.equals(arg_startLine));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.replaceRows(arg_tableId, delimiter: arg_delimiter, encoding: arg_encoding, endLine: arg_endLine, isStrict: arg_isStrict, startLine: arg_startLine).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .replaceRows(arg_tableId,
+              delimiter: arg_delimiter,
+              encoding: arg_encoding,
+              endLine: arg_endLine,
+              isStrict: arg_isStrict,
+              startLine: arg_startLine)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TableResourceApi res = new api.FusiontablesApi(mock).table;
       var arg_request = buildTable();
@@ -2483,11 +2664,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2503,32 +2687,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["replaceViewDefinition"].first, unittest.equals("$arg_replaceViewDefinition"));
-
+        unittest.expect(queryMap["replaceViewDefinition"].first,
+            unittest.equals("$arg_replaceViewDefinition"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, replaceViewDefinition: arg_replaceViewDefinition).then(unittest.expectAsync1(((api.Table response) {
+      res
+          .update(arg_request, arg_tableId,
+              replaceViewDefinition: arg_replaceViewDefinition)
+          .then(unittest.expectAsync1(((api.Table response) {
         checkTable(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TaskResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TaskResourceApi res = new api.FusiontablesApi(mock).task;
       var arg_tableId = "foo";
@@ -2538,18 +2724,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2565,16 +2756,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2583,7 +2775,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TaskResourceApi res = new api.FusiontablesApi(mock).task;
       var arg_tableId = "foo";
@@ -2593,18 +2784,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2620,27 +2816,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_taskId).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .get(arg_tableId, arg_taskId)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TaskResourceApi res = new api.FusiontablesApi(mock).task;
       var arg_tableId = "foo";
@@ -2652,18 +2850,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tasks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/tasks"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2676,34 +2879,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken, startIndex: arg_startIndex).then(unittest.expectAsync1(((api.TaskList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              startIndex: arg_startIndex)
+          .then(unittest.expectAsync1(((api.TaskList response) {
         checkTaskList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TemplateResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_tableId = "foo";
@@ -2713,18 +2922,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2740,25 +2954,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_tableId, arg_templateId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_tableId = "foo";
@@ -2768,18 +2984,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2795,27 +3016,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tableId, arg_templateId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .get(arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_request = buildTemplate();
@@ -2828,18 +3051,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/templates"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/templates"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2852,27 +3080,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tableId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .insert(arg_request, arg_tableId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_tableId = "foo";
@@ -2883,18 +3113,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/templates"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/templates"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2907,29 +3142,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplateList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tableId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TemplateList response) {
+      res
+          .list(arg_tableId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TemplateList response) {
         checkTemplateList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_request = buildTemplate();
@@ -2943,18 +3183,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2970,27 +3215,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tableId, arg_templateId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .patch(arg_request, arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TemplateResourceApi res = new api.FusiontablesApi(mock).template;
       var arg_request = buildTemplate();
@@ -3004,18 +3251,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fusiontables/v2/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tableId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/templates/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3031,27 +3283,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTemplate());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tableId, arg_templateId).then(unittest.expectAsync1(((api.Template response) {
+      res
+          .update(arg_request, arg_tableId, arg_templateId)
+          .then(unittest.expectAsync1(((api.Template response) {
         checkTemplate(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index 32aefa1..3a35d1c 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.games.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/games/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -94,14 +93,14 @@
   buildCounterAchievementDefinition--;
 }
 
-buildUnnamed101() {
+buildUnnamed96() {
   var o = new core.List<api.AchievementDefinition>();
   o.add(buildAchievementDefinition());
   o.add(buildAchievementDefinition());
   return o;
 }
 
-checkUnnamed101(core.List<api.AchievementDefinition> o) {
+checkUnnamed96(core.List<api.AchievementDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementDefinition(o[0]);
   checkAchievementDefinition(o[1]);
@@ -112,7 +111,7 @@
   var o = new api.AchievementDefinitionsListResponse();
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    o.items = buildUnnamed101();
+    o.items = buildUnnamed96();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -120,10 +119,11 @@
   return o;
 }
 
-checkAchievementDefinitionsListResponse(api.AchievementDefinitionsListResponse o) {
+checkAchievementDefinitionsListResponse(
+    api.AchievementDefinitionsListResponse o) {
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    checkUnnamed101(o.items);
+    checkUnnamed96(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -187,7 +187,8 @@
   return o;
 }
 
-checkAchievementSetStepsAtLeastResponse(api.AchievementSetStepsAtLeastResponse o) {
+checkAchievementSetStepsAtLeastResponse(
+    api.AchievementSetStepsAtLeastResponse o) {
   buildCounterAchievementSetStepsAtLeastResponse++;
   if (buildCounterAchievementSetStepsAtLeastResponse < 3) {
     unittest.expect(o.currentSteps, unittest.equals(42));
@@ -218,14 +219,14 @@
   buildCounterAchievementUnlockResponse--;
 }
 
-buildUnnamed102() {
+buildUnnamed97() {
   var o = new core.List<api.AchievementUpdateRequest>();
   o.add(buildAchievementUpdateRequest());
   o.add(buildAchievementUpdateRequest());
   return o;
 }
 
-checkUnnamed102(core.List<api.AchievementUpdateRequest> o) {
+checkUnnamed97(core.List<api.AchievementUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateRequest(o[0]);
   checkAchievementUpdateRequest(o[1]);
@@ -237,7 +238,7 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed102();
+    o.updates = buildUnnamed97();
   }
   buildCounterAchievementUpdateMultipleRequest--;
   return o;
@@ -247,19 +248,19 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed102(o.updates);
+    checkUnnamed97(o.updates);
   }
   buildCounterAchievementUpdateMultipleRequest--;
 }
 
-buildUnnamed103() {
+buildUnnamed98() {
   var o = new core.List<api.AchievementUpdateResponse>();
   o.add(buildAchievementUpdateResponse());
   o.add(buildAchievementUpdateResponse());
   return o;
 }
 
-checkUnnamed103(core.List<api.AchievementUpdateResponse> o) {
+checkUnnamed98(core.List<api.AchievementUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateResponse(o[0]);
   checkAchievementUpdateResponse(o[1]);
@@ -271,17 +272,18 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     o.kind = "foo";
-    o.updatedAchievements = buildUnnamed103();
+    o.updatedAchievements = buildUnnamed98();
   }
   buildCounterAchievementUpdateMultipleResponse--;
   return o;
 }
 
-checkAchievementUpdateMultipleResponse(api.AchievementUpdateMultipleResponse o) {
+checkAchievementUpdateMultipleResponse(
+    api.AchievementUpdateMultipleResponse o) {
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed103(o.updatedAchievements);
+    checkUnnamed98(o.updatedAchievements);
   }
   buildCounterAchievementUpdateMultipleResponse--;
 }
@@ -392,40 +394,40 @@
   buildCounterAnonymousPlayer--;
 }
 
-buildUnnamed104() {
+buildUnnamed99() {
   var o = new core.List<api.ImageAsset>();
   o.add(buildImageAsset());
   o.add(buildImageAsset());
   return o;
 }
 
-checkUnnamed104(core.List<api.ImageAsset> o) {
+checkUnnamed99(core.List<api.ImageAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImageAsset(o[0]);
   checkImageAsset(o[1]);
 }
 
-buildUnnamed105() {
+buildUnnamed100() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed105(core.List<core.String> o) {
+checkUnnamed100(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed106() {
+buildUnnamed101() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed106(core.List<api.Instance> o) {
+checkUnnamed101(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -437,13 +439,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     o.achievementCount = 42;
-    o.assets = buildUnnamed104();
+    o.assets = buildUnnamed99();
     o.author = "foo";
     o.category = buildApplicationCategory();
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed105();
+    o.enabledFeatures = buildUnnamed100();
     o.id = "foo";
-    o.instances = buildUnnamed106();
+    o.instances = buildUnnamed101();
     o.kind = "foo";
     o.lastUpdatedTimestamp = "foo";
     o.leaderboardCount = 42;
@@ -458,13 +460,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     unittest.expect(o.achievementCount, unittest.equals(42));
-    checkUnnamed104(o.assets);
+    checkUnnamed99(o.assets);
     unittest.expect(o.author, unittest.equals('foo'));
     checkApplicationCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed105(o.enabledFeatures);
+    checkUnnamed100(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed106(o.instances);
+    checkUnnamed101(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestamp, unittest.equals('foo'));
     unittest.expect(o.leaderboardCount, unittest.equals(42));
@@ -543,14 +545,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed107() {
+buildUnnamed102() {
   var o = new core.List<api.Category>();
   o.add(buildCategory());
   o.add(buildCategory());
   return o;
 }
 
-checkUnnamed107(core.List<api.Category> o) {
+checkUnnamed102(core.List<api.Category> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCategory(o[0]);
   checkCategory(o[1]);
@@ -561,7 +563,7 @@
   var o = new api.CategoryListResponse();
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    o.items = buildUnnamed107();
+    o.items = buildUnnamed102();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -572,7 +574,7 @@
 checkCategoryListResponse(api.CategoryListResponse o) {
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    checkUnnamed107(o.items);
+    checkUnnamed102(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -623,14 +625,14 @@
   buildCounterEventChild--;
 }
 
-buildUnnamed108() {
+buildUnnamed103() {
   var o = new core.List<api.EventChild>();
   o.add(buildEventChild());
   o.add(buildEventChild());
   return o;
 }
 
-checkUnnamed108(core.List<api.EventChild> o) {
+checkUnnamed103(core.List<api.EventChild> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventChild(o[0]);
   checkEventChild(o[1]);
@@ -641,7 +643,7 @@
   var o = new api.EventDefinition();
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    o.childEvents = buildUnnamed108();
+    o.childEvents = buildUnnamed103();
     o.description = "foo";
     o.displayName = "foo";
     o.id = "foo";
@@ -657,7 +659,7 @@
 checkEventDefinition(api.EventDefinition o) {
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    checkUnnamed108(o.childEvents);
+    checkUnnamed103(o.childEvents);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -669,14 +671,14 @@
   buildCounterEventDefinition--;
 }
 
-buildUnnamed109() {
+buildUnnamed104() {
   var o = new core.List<api.EventDefinition>();
   o.add(buildEventDefinition());
   o.add(buildEventDefinition());
   return o;
 }
 
-checkUnnamed109(core.List<api.EventDefinition> o) {
+checkUnnamed104(core.List<api.EventDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventDefinition(o[0]);
   checkEventDefinition(o[1]);
@@ -687,7 +689,7 @@
   var o = new api.EventDefinitionListResponse();
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    o.items = buildUnnamed109();
+    o.items = buildUnnamed104();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -698,7 +700,7 @@
 checkEventDefinitionListResponse(api.EventDefinitionListResponse o) {
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    checkUnnamed109(o.items);
+    checkUnnamed104(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -728,14 +730,14 @@
   buildCounterEventPeriodRange--;
 }
 
-buildUnnamed110() {
+buildUnnamed105() {
   var o = new core.List<api.EventUpdateRequest>();
   o.add(buildEventUpdateRequest());
   o.add(buildEventUpdateRequest());
   return o;
 }
 
-checkUnnamed110(core.List<api.EventUpdateRequest> o) {
+checkUnnamed105(core.List<api.EventUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventUpdateRequest(o[0]);
   checkEventUpdateRequest(o[1]);
@@ -748,7 +750,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     o.kind = "foo";
     o.timePeriod = buildEventPeriodRange();
-    o.updates = buildUnnamed110();
+    o.updates = buildUnnamed105();
   }
   buildCounterEventPeriodUpdate--;
   return o;
@@ -759,7 +761,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkEventPeriodRange(o.timePeriod);
-    checkUnnamed110(o.updates);
+    checkUnnamed105(o.updates);
   }
   buildCounterEventPeriodUpdate--;
 }
@@ -787,14 +789,14 @@
   buildCounterEventRecordFailure--;
 }
 
-buildUnnamed111() {
+buildUnnamed106() {
   var o = new core.List<api.EventPeriodUpdate>();
   o.add(buildEventPeriodUpdate());
   o.add(buildEventPeriodUpdate());
   return o;
 }
 
-checkUnnamed111(core.List<api.EventPeriodUpdate> o) {
+checkUnnamed106(core.List<api.EventPeriodUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventPeriodUpdate(o[0]);
   checkEventPeriodUpdate(o[1]);
@@ -808,7 +810,7 @@
     o.currentTimeMillis = "foo";
     o.kind = "foo";
     o.requestId = "foo";
-    o.timePeriods = buildUnnamed111();
+    o.timePeriods = buildUnnamed106();
   }
   buildCounterEventRecordRequest--;
   return o;
@@ -820,7 +822,7 @@
     unittest.expect(o.currentTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed111(o.timePeriods);
+    checkUnnamed106(o.timePeriods);
   }
   buildCounterEventRecordRequest--;
 }
@@ -848,40 +850,40 @@
   buildCounterEventUpdateRequest--;
 }
 
-buildUnnamed112() {
+buildUnnamed107() {
   var o = new core.List<api.EventBatchRecordFailure>();
   o.add(buildEventBatchRecordFailure());
   o.add(buildEventBatchRecordFailure());
   return o;
 }
 
-checkUnnamed112(core.List<api.EventBatchRecordFailure> o) {
+checkUnnamed107(core.List<api.EventBatchRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventBatchRecordFailure(o[0]);
   checkEventBatchRecordFailure(o[1]);
 }
 
-buildUnnamed113() {
+buildUnnamed108() {
   var o = new core.List<api.EventRecordFailure>();
   o.add(buildEventRecordFailure());
   o.add(buildEventRecordFailure());
   return o;
 }
 
-checkUnnamed113(core.List<api.EventRecordFailure> o) {
+checkUnnamed108(core.List<api.EventRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventRecordFailure(o[0]);
   checkEventRecordFailure(o[1]);
 }
 
-buildUnnamed114() {
+buildUnnamed109() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed114(core.List<api.PlayerEvent> o) {
+checkUnnamed109(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -892,10 +894,10 @@
   var o = new api.EventUpdateResponse();
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    o.batchFailures = buildUnnamed112();
-    o.eventFailures = buildUnnamed113();
+    o.batchFailures = buildUnnamed107();
+    o.eventFailures = buildUnnamed108();
     o.kind = "foo";
-    o.playerEvents = buildUnnamed114();
+    o.playerEvents = buildUnnamed109();
   }
   buildCounterEventUpdateResponse--;
   return o;
@@ -904,10 +906,10 @@
 checkEventUpdateResponse(api.EventUpdateResponse o) {
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    checkUnnamed112(o.batchFailures);
-    checkUnnamed113(o.eventFailures);
+    checkUnnamed107(o.batchFailures);
+    checkUnnamed108(o.eventFailures);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed114(o.playerEvents);
+    checkUnnamed109(o.playerEvents);
   }
   buildCounterEventUpdateResponse--;
 }
@@ -1161,14 +1163,14 @@
   buildCounterLeaderboardEntry--;
 }
 
-buildUnnamed115() {
+buildUnnamed110() {
   var o = new core.List<api.Leaderboard>();
   o.add(buildLeaderboard());
   o.add(buildLeaderboard());
   return o;
 }
 
-checkUnnamed115(core.List<api.Leaderboard> o) {
+checkUnnamed110(core.List<api.Leaderboard> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboard(o[0]);
   checkLeaderboard(o[1]);
@@ -1179,7 +1181,7 @@
   var o = new api.LeaderboardListResponse();
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    o.items = buildUnnamed115();
+    o.items = buildUnnamed110();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1190,7 +1192,7 @@
 checkLeaderboardListResponse(api.LeaderboardListResponse o) {
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    checkUnnamed115(o.items);
+    checkUnnamed110(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1224,14 +1226,14 @@
   buildCounterLeaderboardScoreRank--;
 }
 
-buildUnnamed116() {
+buildUnnamed111() {
   var o = new core.List<api.LeaderboardEntry>();
   o.add(buildLeaderboardEntry());
   o.add(buildLeaderboardEntry());
   return o;
 }
 
-checkUnnamed116(core.List<api.LeaderboardEntry> o) {
+checkUnnamed111(core.List<api.LeaderboardEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboardEntry(o[0]);
   checkLeaderboardEntry(o[1]);
@@ -1242,7 +1244,7 @@
   var o = new api.LeaderboardScores();
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    o.items = buildUnnamed116();
+    o.items = buildUnnamed111();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.numScores = "foo";
@@ -1256,7 +1258,7 @@
 checkLeaderboardScores(api.LeaderboardScores o) {
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    checkUnnamed116(o.items);
+    checkUnnamed111(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numScores, unittest.equals('foo'));
@@ -1266,14 +1268,14 @@
   buildCounterLeaderboardScores--;
 }
 
-buildUnnamed117() {
+buildUnnamed112() {
   var o = new core.List<api.PlayerLevel>();
   o.add(buildPlayerLevel());
   o.add(buildPlayerLevel());
   return o;
 }
 
-checkUnnamed117(core.List<api.PlayerLevel> o) {
+checkUnnamed112(core.List<api.PlayerLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLevel(o[0]);
   checkPlayerLevel(o[1]);
@@ -1286,7 +1288,7 @@
   if (buildCounterMetagameConfig < 3) {
     o.currentVersion = 42;
     o.kind = "foo";
-    o.playerLevels = buildUnnamed117();
+    o.playerLevels = buildUnnamed112();
   }
   buildCounterMetagameConfig--;
   return o;
@@ -1297,7 +1299,7 @@
   if (buildCounterMetagameConfig < 3) {
     unittest.expect(o.currentVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed117(o.playerLevels);
+    checkUnnamed112(o.playerLevels);
   }
   buildCounterMetagameConfig--;
 }
@@ -1534,14 +1536,14 @@
   buildCounterPlayerAchievement--;
 }
 
-buildUnnamed118() {
+buildUnnamed113() {
   var o = new core.List<api.PlayerAchievement>();
   o.add(buildPlayerAchievement());
   o.add(buildPlayerAchievement());
   return o;
 }
 
-checkUnnamed118(core.List<api.PlayerAchievement> o) {
+checkUnnamed113(core.List<api.PlayerAchievement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerAchievement(o[0]);
   checkPlayerAchievement(o[1]);
@@ -1552,7 +1554,7 @@
   var o = new api.PlayerAchievementListResponse();
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    o.items = buildUnnamed118();
+    o.items = buildUnnamed113();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1563,7 +1565,7 @@
 checkPlayerAchievementListResponse(api.PlayerAchievementListResponse o) {
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    checkUnnamed118(o.items);
+    checkUnnamed113(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1597,14 +1599,14 @@
   buildCounterPlayerEvent--;
 }
 
-buildUnnamed119() {
+buildUnnamed114() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed119(core.List<api.PlayerEvent> o) {
+checkUnnamed114(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -1615,7 +1617,7 @@
   var o = new api.PlayerEventListResponse();
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    o.items = buildUnnamed119();
+    o.items = buildUnnamed114();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1626,7 +1628,7 @@
 checkPlayerEventListResponse(api.PlayerEventListResponse o) {
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    checkUnnamed119(o.items);
+    checkUnnamed114(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1695,14 +1697,14 @@
   buildCounterPlayerLeaderboardScore--;
 }
 
-buildUnnamed120() {
+buildUnnamed115() {
   var o = new core.List<api.PlayerLeaderboardScore>();
   o.add(buildPlayerLeaderboardScore());
   o.add(buildPlayerLeaderboardScore());
   return o;
 }
 
-checkUnnamed120(core.List<api.PlayerLeaderboardScore> o) {
+checkUnnamed115(core.List<api.PlayerLeaderboardScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLeaderboardScore(o[0]);
   checkPlayerLeaderboardScore(o[1]);
@@ -1713,7 +1715,7 @@
   var o = new api.PlayerLeaderboardScoreListResponse();
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    o.items = buildUnnamed120();
+    o.items = buildUnnamed115();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.player = buildPlayer();
@@ -1722,10 +1724,11 @@
   return o;
 }
 
-checkPlayerLeaderboardScoreListResponse(api.PlayerLeaderboardScoreListResponse o) {
+checkPlayerLeaderboardScoreListResponse(
+    api.PlayerLeaderboardScoreListResponse o) {
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    checkUnnamed120(o.items);
+    checkUnnamed115(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPlayer(o.player);
@@ -1758,14 +1761,14 @@
   buildCounterPlayerLevel--;
 }
 
-buildUnnamed121() {
+buildUnnamed116() {
   var o = new core.List<api.Player>();
   o.add(buildPlayer());
   o.add(buildPlayer());
   return o;
 }
 
-checkUnnamed121(core.List<api.Player> o) {
+checkUnnamed116(core.List<api.Player> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayer(o[0]);
   checkPlayer(o[1]);
@@ -1776,7 +1779,7 @@
   var o = new api.PlayerListResponse();
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    o.items = buildUnnamed121();
+    o.items = buildUnnamed116();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1787,7 +1790,7 @@
 checkPlayerListResponse(api.PlayerListResponse o) {
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    checkUnnamed121(o.items);
+    checkUnnamed116(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1821,14 +1824,14 @@
   buildCounterPlayerScore--;
 }
 
-buildUnnamed122() {
+buildUnnamed117() {
   var o = new core.List<api.PlayerScoreResponse>();
   o.add(buildPlayerScoreResponse());
   o.add(buildPlayerScoreResponse());
   return o;
 }
 
-checkUnnamed122(core.List<api.PlayerScoreResponse> o) {
+checkUnnamed117(core.List<api.PlayerScoreResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResponse(o[0]);
   checkPlayerScoreResponse(o[1]);
@@ -1840,7 +1843,7 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     o.kind = "foo";
-    o.submittedScores = buildUnnamed122();
+    o.submittedScores = buildUnnamed117();
   }
   buildCounterPlayerScoreListResponse--;
   return o;
@@ -1850,32 +1853,32 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed122(o.submittedScores);
+    checkUnnamed117(o.submittedScores);
   }
   buildCounterPlayerScoreListResponse--;
 }
 
-buildUnnamed123() {
+buildUnnamed118() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed123(core.List<core.String> o) {
+checkUnnamed118(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed124() {
+buildUnnamed119() {
   var o = new core.List<api.PlayerScore>();
   o.add(buildPlayerScore());
   o.add(buildPlayerScore());
   return o;
 }
 
-checkUnnamed124(core.List<api.PlayerScore> o) {
+checkUnnamed119(core.List<api.PlayerScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScore(o[0]);
   checkPlayerScore(o[1]);
@@ -1886,12 +1889,12 @@
   var o = new api.PlayerScoreResponse();
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    o.beatenScoreTimeSpans = buildUnnamed123();
+    o.beatenScoreTimeSpans = buildUnnamed118();
     o.formattedScore = "foo";
     o.kind = "foo";
     o.leaderboardId = "foo";
     o.scoreTag = "foo";
-    o.unbeatenScores = buildUnnamed124();
+    o.unbeatenScores = buildUnnamed119();
   }
   buildCounterPlayerScoreResponse--;
   return o;
@@ -1900,24 +1903,24 @@
 checkPlayerScoreResponse(api.PlayerScoreResponse o) {
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    checkUnnamed123(o.beatenScoreTimeSpans);
+    checkUnnamed118(o.beatenScoreTimeSpans);
     unittest.expect(o.formattedScore, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.leaderboardId, unittest.equals('foo'));
     unittest.expect(o.scoreTag, unittest.equals('foo'));
-    checkUnnamed124(o.unbeatenScores);
+    checkUnnamed119(o.unbeatenScores);
   }
   buildCounterPlayerScoreResponse--;
 }
 
-buildUnnamed125() {
+buildUnnamed120() {
   var o = new core.List<api.ScoreSubmission>();
   o.add(buildScoreSubmission());
   o.add(buildScoreSubmission());
   return o;
 }
 
-checkUnnamed125(core.List<api.ScoreSubmission> o) {
+checkUnnamed120(core.List<api.ScoreSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScoreSubmission(o[0]);
   checkScoreSubmission(o[1]);
@@ -1929,7 +1932,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     o.kind = "foo";
-    o.scores = buildUnnamed125();
+    o.scores = buildUnnamed120();
   }
   buildCounterPlayerScoreSubmissionList--;
   return o;
@@ -1939,7 +1942,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed125(o.scores);
+    checkUnnamed120(o.scores);
   }
   buildCounterPlayerScoreSubmissionList--;
 }
@@ -2032,14 +2035,14 @@
   buildCounterPushTokenId--;
 }
 
-buildUnnamed126() {
+buildUnnamed121() {
   var o = new core.List<api.QuestMilestone>();
   o.add(buildQuestMilestone());
   o.add(buildQuestMilestone());
   return o;
 }
 
-checkUnnamed126(core.List<api.QuestMilestone> o) {
+checkUnnamed121(core.List<api.QuestMilestone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestMilestone(o[0]);
   checkQuestMilestone(o[1]);
@@ -2061,7 +2064,7 @@
     o.isDefaultIconUrl = true;
     o.kind = "foo";
     o.lastUpdatedTimestampMillis = "foo";
-    o.milestones = buildUnnamed126();
+    o.milestones = buildUnnamed121();
     o.name = "foo";
     o.notifyTimestampMillis = "foo";
     o.startTimestampMillis = "foo";
@@ -2085,7 +2088,7 @@
     unittest.expect(o.isDefaultIconUrl, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestampMillis, unittest.equals('foo'));
-    checkUnnamed126(o.milestones);
+    checkUnnamed121(o.milestones);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notifyTimestampMillis, unittest.equals('foo'));
     unittest.expect(o.startTimestampMillis, unittest.equals('foo'));
@@ -2144,14 +2147,14 @@
   buildCounterQuestCriterion--;
 }
 
-buildUnnamed127() {
+buildUnnamed122() {
   var o = new core.List<api.Quest>();
   o.add(buildQuest());
   o.add(buildQuest());
   return o;
 }
 
-checkUnnamed127(core.List<api.Quest> o) {
+checkUnnamed122(core.List<api.Quest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuest(o[0]);
   checkQuest(o[1]);
@@ -2162,7 +2165,7 @@
   var o = new api.QuestListResponse();
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    o.items = buildUnnamed127();
+    o.items = buildUnnamed122();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2173,21 +2176,21 @@
 checkQuestListResponse(api.QuestListResponse o) {
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    checkUnnamed127(o.items);
+    checkUnnamed122(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterQuestListResponse--;
 }
 
-buildUnnamed128() {
+buildUnnamed123() {
   var o = new core.List<api.QuestCriterion>();
   o.add(buildQuestCriterion());
   o.add(buildQuestCriterion());
   return o;
 }
 
-checkUnnamed128(core.List<api.QuestCriterion> o) {
+checkUnnamed123(core.List<api.QuestCriterion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestCriterion(o[0]);
   checkQuestCriterion(o[1]);
@@ -2199,7 +2202,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     o.completionRewardData = "foo";
-    o.criteria = buildUnnamed128();
+    o.criteria = buildUnnamed123();
     o.id = "foo";
     o.kind = "foo";
     o.state = "foo";
@@ -2212,7 +2215,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     unittest.expect(o.completionRewardData, unittest.equals('foo'));
-    checkUnnamed128(o.criteria);
+    checkUnnamed123(o.criteria);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2243,14 +2246,14 @@
   buildCounterRevisionCheckResponse--;
 }
 
-buildUnnamed129() {
+buildUnnamed124() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed129(core.List<api.RoomParticipant> o) {
+checkUnnamed124(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2269,7 +2272,7 @@
     o.inviterId = "foo";
     o.kind = "foo";
     o.lastUpdateDetails = buildRoomModification();
-    o.participants = buildUnnamed129();
+    o.participants = buildUnnamed124();
     o.roomId = "foo";
     o.roomStatusVersion = 42;
     o.status = "foo";
@@ -2290,7 +2293,7 @@
     unittest.expect(o.inviterId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRoomModification(o.lastUpdateDetails);
-    checkUnnamed129(o.participants);
+    checkUnnamed124(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.roomStatusVersion, unittest.equals(42));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2366,27 +2369,27 @@
   buildCounterRoomClientAddress--;
 }
 
-buildUnnamed130() {
+buildUnnamed125() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed130(core.List<core.String> o) {
+checkUnnamed125(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed131() {
+buildUnnamed126() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed131(core.List<core.String> o) {
+checkUnnamed126(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2398,9 +2401,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     o.autoMatchingCriteria = buildRoomAutoMatchingCriteria();
-    o.capabilities = buildUnnamed130();
+    o.capabilities = buildUnnamed125();
     o.clientAddress = buildRoomClientAddress();
-    o.invitedPlayerIds = buildUnnamed131();
+    o.invitedPlayerIds = buildUnnamed126();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
     o.requestId = "foo";
@@ -2414,9 +2417,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     checkRoomAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed130(o.capabilities);
+    checkUnnamed125(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
-    checkUnnamed131(o.invitedPlayerIds);
+    checkUnnamed126(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
     unittest.expect(o.requestId, unittest.equals('foo'));
@@ -2425,14 +2428,14 @@
   buildCounterRoomCreateRequest--;
 }
 
-buildUnnamed132() {
+buildUnnamed127() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed132(core.List<core.String> o) {
+checkUnnamed127(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2443,7 +2446,7 @@
   var o = new api.RoomJoinRequest();
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    o.capabilities = buildUnnamed132();
+    o.capabilities = buildUnnamed127();
     o.clientAddress = buildRoomClientAddress();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
@@ -2455,7 +2458,7 @@
 checkRoomJoinRequest(api.RoomJoinRequest o) {
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    checkUnnamed132(o.capabilities);
+    checkUnnamed127(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
@@ -2463,14 +2466,14 @@
   buildCounterRoomJoinRequest--;
 }
 
-buildUnnamed133() {
+buildUnnamed128() {
   var o = new core.List<api.PeerSessionDiagnostics>();
   o.add(buildPeerSessionDiagnostics());
   o.add(buildPeerSessionDiagnostics());
   return o;
 }
 
-checkUnnamed133(core.List<api.PeerSessionDiagnostics> o) {
+checkUnnamed128(core.List<api.PeerSessionDiagnostics> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPeerSessionDiagnostics(o[0]);
   checkPeerSessionDiagnostics(o[1]);
@@ -2487,7 +2490,7 @@
     o.kind = "foo";
     o.networkOperatorCode = "foo";
     o.networkOperatorName = "foo";
-    o.peerSession = buildUnnamed133();
+    o.peerSession = buildUnnamed128();
     o.socketsUsed = true;
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2503,7 +2506,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.networkOperatorCode, unittest.equals('foo'));
     unittest.expect(o.networkOperatorName, unittest.equals('foo'));
-    checkUnnamed133(o.peerSession);
+    checkUnnamed128(o.peerSession);
     unittest.expect(o.socketsUsed, unittest.isTrue);
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2532,14 +2535,14 @@
   buildCounterRoomLeaveRequest--;
 }
 
-buildUnnamed134() {
+buildUnnamed129() {
   var o = new core.List<api.Room>();
   o.add(buildRoom());
   o.add(buildRoom());
   return o;
 }
 
-checkUnnamed134(core.List<api.Room> o) {
+checkUnnamed129(core.List<api.Room> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoom(o[0]);
   checkRoom(o[1]);
@@ -2550,7 +2553,7 @@
   var o = new api.RoomList();
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    o.items = buildUnnamed134();
+    o.items = buildUnnamed129();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2561,7 +2564,7 @@
 checkRoomList(api.RoomList o) {
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    checkUnnamed134(o.items);
+    checkUnnamed129(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2622,14 +2625,14 @@
   buildCounterRoomP2PStatus--;
 }
 
-buildUnnamed135() {
+buildUnnamed130() {
   var o = new core.List<api.RoomP2PStatus>();
   o.add(buildRoomP2PStatus());
   o.add(buildRoomP2PStatus());
   return o;
 }
 
-checkUnnamed135(core.List<api.RoomP2PStatus> o) {
+checkUnnamed130(core.List<api.RoomP2PStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomP2PStatus(o[0]);
   checkRoomP2PStatus(o[1]);
@@ -2641,7 +2644,7 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed135();
+    o.updates = buildUnnamed130();
   }
   buildCounterRoomP2PStatuses--;
   return o;
@@ -2651,19 +2654,19 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed135(o.updates);
+    checkUnnamed130(o.updates);
   }
   buildCounterRoomP2PStatuses--;
 }
 
-buildUnnamed136() {
+buildUnnamed131() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed136(core.List<core.String> o) {
+checkUnnamed131(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2676,7 +2679,7 @@
   if (buildCounterRoomParticipant < 3) {
     o.autoMatched = true;
     o.autoMatchedPlayer = buildAnonymousPlayer();
-    o.capabilities = buildUnnamed136();
+    o.capabilities = buildUnnamed131();
     o.clientAddress = buildRoomClientAddress();
     o.connected = true;
     o.id = "foo";
@@ -2694,7 +2697,7 @@
   if (buildCounterRoomParticipant < 3) {
     unittest.expect(o.autoMatched, unittest.isTrue);
     checkAnonymousPlayer(o.autoMatchedPlayer);
-    checkUnnamed136(o.capabilities);
+    checkUnnamed131(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.connected, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2706,14 +2709,14 @@
   buildCounterRoomParticipant--;
 }
 
-buildUnnamed137() {
+buildUnnamed132() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed137(core.List<api.RoomParticipant> o) {
+checkUnnamed132(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2726,7 +2729,7 @@
   if (buildCounterRoomStatus < 3) {
     o.autoMatchingStatus = buildRoomAutoMatchStatus();
     o.kind = "foo";
-    o.participants = buildUnnamed137();
+    o.participants = buildUnnamed132();
     o.roomId = "foo";
     o.status = "foo";
     o.statusVersion = 42;
@@ -2740,7 +2743,7 @@
   if (buildCounterRoomStatus < 3) {
     checkRoomAutoMatchStatus(o.autoMatchingStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed137(o.participants);
+    checkUnnamed132(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusVersion, unittest.equals(42));
@@ -2841,14 +2844,14 @@
   buildCounterSnapshotImage--;
 }
 
-buildUnnamed138() {
+buildUnnamed133() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed138(core.List<api.Snapshot> o) {
+checkUnnamed133(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -2859,7 +2862,7 @@
   var o = new api.SnapshotListResponse();
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    o.items = buildUnnamed138();
+    o.items = buildUnnamed133();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2870,7 +2873,7 @@
 checkSnapshotListResponse(api.SnapshotListResponse o) {
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    checkUnnamed138(o.items);
+    checkUnnamed133(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2902,27 +2905,27 @@
   buildCounterTurnBasedAutoMatchingCriteria--;
 }
 
-buildUnnamed139() {
+buildUnnamed134() {
   var o = new core.List<api.TurnBasedMatchParticipant>();
   o.add(buildTurnBasedMatchParticipant());
   o.add(buildTurnBasedMatchParticipant());
   return o;
 }
 
-checkUnnamed139(core.List<api.TurnBasedMatchParticipant> o) {
+checkUnnamed134(core.List<api.TurnBasedMatchParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatchParticipant(o[0]);
   checkTurnBasedMatchParticipant(o[1]);
 }
 
-buildUnnamed140() {
+buildUnnamed135() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed140(core.List<api.ParticipantResult> o) {
+checkUnnamed135(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -2944,11 +2947,11 @@
     o.matchId = "foo";
     o.matchNumber = 42;
     o.matchVersion = 42;
-    o.participants = buildUnnamed139();
+    o.participants = buildUnnamed134();
     o.pendingParticipantId = "foo";
     o.previousMatchData = buildTurnBasedMatchData();
     o.rematchId = "foo";
-    o.results = buildUnnamed140();
+    o.results = buildUnnamed135();
     o.status = "foo";
     o.userMatchStatus = "foo";
     o.variant = 42;
@@ -2972,11 +2975,11 @@
     unittest.expect(o.matchId, unittest.equals('foo'));
     unittest.expect(o.matchNumber, unittest.equals(42));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed139(o.participants);
+    checkUnnamed134(o.participants);
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
     checkTurnBasedMatchData(o.previousMatchData);
     unittest.expect(o.rematchId, unittest.equals('foo'));
-    checkUnnamed140(o.results);
+    checkUnnamed135(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userMatchStatus, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2985,14 +2988,14 @@
   buildCounterTurnBasedMatch--;
 }
 
-buildUnnamed141() {
+buildUnnamed136() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed141(core.List<core.String> o) {
+checkUnnamed136(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3004,7 +3007,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     o.autoMatchingCriteria = buildTurnBasedAutoMatchingCriteria();
-    o.invitedPlayerIds = buildUnnamed141();
+    o.invitedPlayerIds = buildUnnamed136();
     o.kind = "foo";
     o.requestId = "foo";
     o.variant = 42;
@@ -3017,7 +3020,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     checkTurnBasedAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed141(o.invitedPlayerIds);
+    checkUnnamed136(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -3069,14 +3072,14 @@
   buildCounterTurnBasedMatchDataRequest--;
 }
 
-buildUnnamed142() {
+buildUnnamed137() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed142(core.List<api.TurnBasedMatch> o) {
+checkUnnamed137(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3087,7 +3090,7 @@
   var o = new api.TurnBasedMatchList();
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    o.items = buildUnnamed142();
+    o.items = buildUnnamed137();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3098,7 +3101,7 @@
 checkTurnBasedMatchList(api.TurnBasedMatchList o) {
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    checkUnnamed142(o.items);
+    checkUnnamed137(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3180,14 +3183,14 @@
   buildCounterTurnBasedMatchRematch--;
 }
 
-buildUnnamed143() {
+buildUnnamed138() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed143(core.List<api.ParticipantResult> o) {
+checkUnnamed138(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3201,7 +3204,7 @@
     o.data = buildTurnBasedMatchDataRequest();
     o.kind = "foo";
     o.matchVersion = 42;
-    o.results = buildUnnamed143();
+    o.results = buildUnnamed138();
   }
   buildCounterTurnBasedMatchResults--;
   return o;
@@ -3213,19 +3216,19 @@
     checkTurnBasedMatchDataRequest(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed143(o.results);
+    checkUnnamed138(o.results);
   }
   buildCounterTurnBasedMatchResults--;
 }
 
-buildUnnamed144() {
+buildUnnamed139() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed144(core.List<api.TurnBasedMatch> o) {
+checkUnnamed139(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3236,7 +3239,7 @@
   var o = new api.TurnBasedMatchSync();
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    o.items = buildUnnamed144();
+    o.items = buildUnnamed139();
     o.kind = "foo";
     o.moreAvailable = true;
     o.nextPageToken = "foo";
@@ -3248,7 +3251,7 @@
 checkTurnBasedMatchSync(api.TurnBasedMatchSync o) {
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    checkUnnamed144(o.items);
+    checkUnnamed139(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.moreAvailable, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -3256,14 +3259,14 @@
   buildCounterTurnBasedMatchSync--;
 }
 
-buildUnnamed145() {
+buildUnnamed140() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed145(core.List<api.ParticipantResult> o) {
+checkUnnamed140(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3278,7 +3281,7 @@
     o.kind = "foo";
     o.matchVersion = 42;
     o.pendingParticipantId = "foo";
-    o.results = buildUnnamed145();
+    o.results = buildUnnamed140();
   }
   buildCounterTurnBasedMatchTurn--;
   return o;
@@ -3291,12 +3294,11 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
-    checkUnnamed145(o.results);
+    checkUnnamed140(o.results);
   }
   buildCounterTurnBasedMatchTurn--;
 }
 
-
 main() {
   unittest.group("obj-schema-AchievementDefinition", () {
     unittest.test("to-json--from-json", () {
@@ -3306,7 +3308,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementDefinitionsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementDefinitionsListResponse();
@@ -3315,7 +3316,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementIncrementResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementIncrementResponse();
@@ -3324,7 +3324,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementRevealResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementRevealResponse();
@@ -3333,7 +3332,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementSetStepsAtLeastResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementSetStepsAtLeastResponse();
@@ -3342,7 +3340,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementUnlockResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementUnlockResponse();
@@ -3351,7 +3348,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementUpdateMultipleRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementUpdateMultipleRequest();
@@ -3360,7 +3356,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementUpdateMultipleResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementUpdateMultipleResponse();
@@ -3369,7 +3364,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementUpdateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementUpdateRequest();
@@ -3378,7 +3372,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementUpdateResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementUpdateResponse();
@@ -3387,7 +3380,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AggregateStats", () {
     unittest.test("to-json--from-json", () {
       var o = buildAggregateStats();
@@ -3396,7 +3388,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnonymousPlayer", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnonymousPlayer();
@@ -3405,7 +3396,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Application", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplication();
@@ -3414,7 +3404,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationCategory", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationCategory();
@@ -3423,7 +3412,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApplicationVerifyResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildApplicationVerifyResponse();
@@ -3432,7 +3420,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Category", () {
     unittest.test("to-json--from-json", () {
       var o = buildCategory();
@@ -3441,7 +3428,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CategoryListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCategoryListResponse();
@@ -3450,7 +3436,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventBatchRecordFailure", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventBatchRecordFailure();
@@ -3459,7 +3444,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventChild", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventChild();
@@ -3468,7 +3452,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventDefinition", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventDefinition();
@@ -3477,7 +3460,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventDefinitionListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventDefinitionListResponse();
@@ -3486,7 +3468,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventPeriodRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventPeriodRange();
@@ -3495,7 +3476,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventPeriodUpdate", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventPeriodUpdate();
@@ -3504,7 +3484,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventRecordFailure", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventRecordFailure();
@@ -3513,7 +3492,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventRecordRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventRecordRequest();
@@ -3522,7 +3500,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventUpdateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventUpdateRequest();
@@ -3531,7 +3508,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventUpdateResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventUpdateResponse();
@@ -3540,7 +3516,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GamesAchievementIncrement", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesAchievementIncrement();
@@ -3549,7 +3524,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GamesAchievementSetStepsAtLeast", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesAchievementSetStepsAtLeast();
@@ -3558,7 +3532,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageAsset", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageAsset();
@@ -3567,7 +3540,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Instance", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstance();
@@ -3576,7 +3548,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceAndroidDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceAndroidDetails();
@@ -3585,7 +3556,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceIosDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceIosDetails();
@@ -3594,7 +3564,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceWebDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceWebDetails();
@@ -3603,7 +3572,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Leaderboard", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboard();
@@ -3612,7 +3580,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardEntry();
@@ -3621,7 +3588,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardListResponse();
@@ -3630,7 +3596,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardScoreRank", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardScoreRank();
@@ -3639,7 +3604,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardScores", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardScores();
@@ -3648,7 +3612,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetagameConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetagameConfig();
@@ -3657,7 +3620,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NetworkDiagnostics", () {
     unittest.test("to-json--from-json", () {
       var o = buildNetworkDiagnostics();
@@ -3666,7 +3628,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ParticipantResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildParticipantResult();
@@ -3675,7 +3636,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PeerChannelDiagnostics", () {
     unittest.test("to-json--from-json", () {
       var o = buildPeerChannelDiagnostics();
@@ -3684,7 +3644,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PeerSessionDiagnostics", () {
     unittest.test("to-json--from-json", () {
       var o = buildPeerSessionDiagnostics();
@@ -3693,7 +3652,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Played", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayed();
@@ -3702,7 +3660,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerName", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerName();
@@ -3711,7 +3668,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Player", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayer();
@@ -3720,7 +3676,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerAchievement", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerAchievement();
@@ -3729,7 +3684,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerAchievementListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerAchievementListResponse();
@@ -3738,7 +3692,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerEvent();
@@ -3747,7 +3700,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerEventListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerEventListResponse();
@@ -3756,7 +3708,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerExperienceInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerExperienceInfo();
@@ -3765,7 +3716,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerLeaderboardScore", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerLeaderboardScore();
@@ -3774,7 +3724,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerLeaderboardScoreListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerLeaderboardScoreListResponse();
@@ -3783,7 +3732,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerLevel", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerLevel();
@@ -3792,7 +3740,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerListResponse();
@@ -3801,7 +3748,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerScore", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScore();
@@ -3810,7 +3756,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerScoreListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScoreListResponse();
@@ -3819,7 +3764,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerScoreResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScoreResponse();
@@ -3828,7 +3772,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerScoreSubmissionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScoreSubmissionList();
@@ -3837,7 +3780,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileSettings();
@@ -3846,7 +3788,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PushToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildPushToken();
@@ -3855,7 +3796,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PushTokenIdIos", () {
     unittest.test("to-json--from-json", () {
       var o = buildPushTokenIdIos();
@@ -3864,7 +3804,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PushTokenId", () {
     unittest.test("to-json--from-json", () {
       var o = buildPushTokenId();
@@ -3873,7 +3812,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Quest", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuest();
@@ -3882,7 +3820,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuestContribution", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuestContribution();
@@ -3891,7 +3828,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuestCriterion", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuestCriterion();
@@ -3900,7 +3836,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuestListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuestListResponse();
@@ -3909,7 +3844,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuestMilestone", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuestMilestone();
@@ -3918,7 +3852,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RevisionCheckResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRevisionCheckResponse();
@@ -3927,7 +3860,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Room", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoom();
@@ -3936,7 +3868,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomAutoMatchStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomAutoMatchStatus();
@@ -3945,7 +3876,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomAutoMatchingCriteria", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomAutoMatchingCriteria();
@@ -3954,7 +3884,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomClientAddress", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomClientAddress();
@@ -3963,7 +3892,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomCreateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomCreateRequest();
@@ -3972,7 +3900,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomJoinRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomJoinRequest();
@@ -3981,7 +3908,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomLeaveDiagnostics", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomLeaveDiagnostics();
@@ -3990,7 +3916,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomLeaveRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomLeaveRequest();
@@ -3999,7 +3924,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomList", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomList();
@@ -4008,7 +3932,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomModification", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomModification();
@@ -4017,7 +3940,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomP2PStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomP2PStatus();
@@ -4026,7 +3948,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomP2PStatuses", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomP2PStatuses();
@@ -4035,7 +3956,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomParticipant", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomParticipant();
@@ -4044,7 +3964,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RoomStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildRoomStatus();
@@ -4053,7 +3972,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ScoreSubmission", () {
     unittest.test("to-json--from-json", () {
       var o = buildScoreSubmission();
@@ -4062,7 +3980,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Snapshot", () {
     unittest.test("to-json--from-json", () {
       var o = buildSnapshot();
@@ -4071,7 +3988,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SnapshotImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildSnapshotImage();
@@ -4080,7 +3996,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SnapshotListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSnapshotListResponse();
@@ -4089,7 +4004,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedAutoMatchingCriteria", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedAutoMatchingCriteria();
@@ -4098,7 +4012,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatch", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatch();
@@ -4107,7 +4020,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchCreateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchCreateRequest();
@@ -4116,7 +4028,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchData", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchData();
@@ -4125,7 +4036,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchDataRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchDataRequest();
@@ -4134,7 +4044,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchList();
@@ -4143,7 +4052,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchModification", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchModification();
@@ -4152,7 +4060,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchParticipant", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchParticipant();
@@ -4161,7 +4068,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchRematch", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchRematch();
@@ -4170,7 +4076,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchResults", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchResults();
@@ -4179,7 +4084,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchSync", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchSync();
@@ -4188,7 +4092,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TurnBasedMatchTurn", () {
     unittest.test("to-json--from-json", () {
       var o = buildTurnBasedMatchTurn();
@@ -4197,12 +4100,11 @@
     });
   });
 
-
   unittest.group("resource-AchievementDefinitionsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AchievementDefinitionsResourceApi res = new api.GamesApi(mock).achievementDefinitions;
+      api.AchievementDefinitionsResourceApi res =
+          new api.GamesApi(mock).achievementDefinitions;
       var arg_consistencyToken = "foo";
       var arg_language = "foo";
       var arg_maxResults = 42;
@@ -4212,11 +4114,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("achievements"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("achievements"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -4229,35 +4134,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildAchievementDefinitionsListResponse());
+        var resp =
+            convert.JSON.encode(buildAchievementDefinitionsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AchievementDefinitionsListResponse response) {
+      res
+          .list(
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.AchievementDefinitionsListResponse response) {
         checkAchievementDefinitionsListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AchievementsResourceApi", () {
     unittest.test("method--increment", () {
-
       var mock = new HttpServerMock();
       api.AchievementsResourceApi res = new api.GamesApi(mock).achievements;
       var arg_achievementId = "foo";
@@ -4269,18 +4184,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/increment", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_achievementId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/increment"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/increment"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -4293,30 +4213,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["stepsToIncrement"].first), unittest.equals(arg_stepsToIncrement));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(core.int.parse(queryMap["stepsToIncrement"].first),
+            unittest.equals(arg_stepsToIncrement));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementIncrementResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.increment(arg_achievementId, arg_stepsToIncrement, consistencyToken: arg_consistencyToken, requestId: arg_requestId).then(unittest.expectAsync1(((api.AchievementIncrementResponse response) {
+      res
+          .increment(arg_achievementId, arg_stepsToIncrement,
+              consistencyToken: arg_consistencyToken, requestId: arg_requestId)
+          .then(unittest
+              .expectAsync1(((api.AchievementIncrementResponse response) {
         checkAchievementIncrementResponse(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.AchievementsResourceApi res = new api.GamesApi(mock).achievements;
       var arg_playerId = "foo";
@@ -4330,18 +4257,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/achievements", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_playerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/achievements"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/achievements"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -4354,32 +4286,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["state"].first, unittest.equals(arg_state));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerAchievementListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_playerId, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken, state: arg_state).then(unittest.expectAsync1(((api.PlayerAchievementListResponse response) {
+      res
+          .list(arg_playerId,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              state: arg_state)
+          .then(unittest
+              .expectAsync1(((api.PlayerAchievementListResponse response) {
         checkPlayerAchievementListResponse(response);
       })));
     });
 
     unittest.test("method--reveal", () {
-
       var mock = new HttpServerMock();
       api.AchievementsResourceApi res = new api.GamesApi(mock).achievements;
       var arg_achievementId = "foo";
@@ -4389,18 +4333,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/reveal", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_achievementId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/reveal"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/reveal"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -4413,28 +4362,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementRevealResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reveal(arg_achievementId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.AchievementRevealResponse response) {
+      res
+          .reveal(arg_achievementId, consistencyToken: arg_consistencyToken)
+          .then(
+              unittest.expectAsync1(((api.AchievementRevealResponse response) {
         checkAchievementRevealResponse(response);
       })));
     });
 
     unittest.test("method--setStepsAtLeast", () {
-
       var mock = new HttpServerMock();
       api.AchievementsResourceApi res = new api.GamesApi(mock).achievements;
       var arg_achievementId = "foo";
@@ -4445,18 +4398,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/setStepsAtLeast", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_achievementId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/setStepsAtLeast"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/setStepsAtLeast"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -4469,29 +4427,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["steps"].first), unittest.equals(arg_steps));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(core.int.parse(queryMap["steps"].first),
+            unittest.equals(arg_steps));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildAchievementSetStepsAtLeastResponse());
+        var resp =
+            convert.JSON.encode(buildAchievementSetStepsAtLeastResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setStepsAtLeast(arg_achievementId, arg_steps, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.AchievementSetStepsAtLeastResponse response) {
+      res
+          .setStepsAtLeast(arg_achievementId, arg_steps,
+              consistencyToken: arg_consistencyToken)
+          .then(unittest
+              .expectAsync1(((api.AchievementSetStepsAtLeastResponse response) {
         checkAchievementSetStepsAtLeastResponse(response);
       })));
     });
 
     unittest.test("method--unlock", () {
-
       var mock = new HttpServerMock();
       api.AchievementsResourceApi res = new api.GamesApi(mock).achievements;
       var arg_achievementId = "foo";
@@ -4501,18 +4466,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/unlock", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_achievementId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/unlock"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/unlock"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -4525,28 +4495,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementUnlockResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unlock(arg_achievementId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.AchievementUnlockResponse response) {
+      res
+          .unlock(arg_achievementId, consistencyToken: arg_consistencyToken)
+          .then(
+              unittest.expectAsync1(((api.AchievementUnlockResponse response) {
         checkAchievementUnlockResponse(response);
       })));
     });
 
     unittest.test("method--updateMultiple", () {
-
       var mock = new HttpServerMock();
       api.AchievementsResourceApi res = new api.GamesApi(mock).achievements;
       var arg_request = buildAchievementUpdateMultipleRequest();
@@ -4559,11 +4533,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("achievements/updateMultiple"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 27),
+            unittest.equals("achievements/updateMultiple"));
         pathOffset += 27;
 
         var query = (req.url).query;
@@ -4576,32 +4553,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildAchievementUpdateMultipleResponse());
+        var resp =
+            convert.JSON.encode(buildAchievementUpdateMultipleResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.updateMultiple(arg_request, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.AchievementUpdateMultipleResponse response) {
+      res
+          .updateMultiple(arg_request, consistencyToken: arg_consistencyToken)
+          .then(unittest
+              .expectAsync1(((api.AchievementUpdateMultipleResponse response) {
         checkAchievementUpdateMultipleResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ApplicationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ApplicationsResourceApi res = new api.GamesApi(mock).applications;
       var arg_applicationId = "foo";
@@ -4613,11 +4593,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4633,30 +4616,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(queryMap["platformType"].first, unittest.equals(arg_platformType));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(
+            queryMap["platformType"].first, unittest.equals(arg_platformType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApplication());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_applicationId, consistencyToken: arg_consistencyToken, language: arg_language, platformType: arg_platformType).then(unittest.expectAsync1(((api.Application response) {
+      res
+          .get(arg_applicationId,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              platformType: arg_platformType)
+          .then(unittest.expectAsync1(((api.Application response) {
         checkApplication(response);
       })));
     });
 
     unittest.test("method--played", () {
-
       var mock = new HttpServerMock();
       api.ApplicationsResourceApi res = new api.GamesApi(mock).applications;
       var arg_consistencyToken = "foo";
@@ -4665,11 +4656,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("applications/played"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("applications/played"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -4682,26 +4676,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.played(consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .played(consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--verify", () {
-
       var mock = new HttpServerMock();
       api.ApplicationsResourceApi res = new api.GamesApi(mock).applications;
       var arg_applicationId = "foo";
@@ -4711,18 +4708,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/verify", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/verify"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/verify"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -4735,32 +4737,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildApplicationVerifyResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.verify(arg_applicationId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.ApplicationVerifyResponse response) {
+      res
+          .verify(arg_applicationId, consistencyToken: arg_consistencyToken)
+          .then(
+              unittest.expectAsync1(((api.ApplicationVerifyResponse response) {
         checkApplicationVerifyResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EventsResourceApi", () {
     unittest.test("method--listByPlayer", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesApi(mock).events;
       var arg_consistencyToken = "foo";
@@ -4772,11 +4776,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("events"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("events"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4789,31 +4796,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerEventListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listByPlayer(consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PlayerEventListResponse response) {
+      res
+          .listByPlayer(
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.PlayerEventListResponse response) {
         checkPlayerEventListResponse(response);
       })));
     });
 
     unittest.test("method--listDefinitions", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesApi(mock).events;
       var arg_consistencyToken = "foo";
@@ -4825,11 +4842,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("eventDefinitions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("eventDefinitions"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -4842,31 +4862,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEventDefinitionListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listDefinitions(consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.EventDefinitionListResponse response) {
+      res
+          .listDefinitions(
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.EventDefinitionListResponse response) {
         checkEventDefinitionListResponse(response);
       })));
     });
 
     unittest.test("method--record", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesApi(mock).events;
       var arg_request = buildEventRecordRequest();
@@ -4880,11 +4911,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("events"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("events"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -4897,33 +4931,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEventUpdateResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.record(arg_request, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.EventUpdateResponse response) {
+      res
+          .record(arg_request,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.EventUpdateResponse response) {
         checkEventUpdateResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LeaderboardsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.LeaderboardsResourceApi res = new api.GamesApi(mock).leaderboards;
       var arg_leaderboardId = "foo";
@@ -4934,11 +4971,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4954,29 +4994,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboard());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_leaderboardId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Leaderboard response) {
+      res
+          .get(arg_leaderboardId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Leaderboard response) {
         checkLeaderboard(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.LeaderboardsResourceApi res = new api.GamesApi(mock).leaderboards;
       var arg_consistencyToken = "foo";
@@ -4988,11 +5033,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("leaderboards"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("leaderboards"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -5005,35 +5053,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LeaderboardListResponse response) {
+      res
+          .list(
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.LeaderboardListResponse response) {
         checkLeaderboardListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MetagameResourceApi", () {
     unittest.test("method--getMetagameConfig", () {
-
       var mock = new HttpServerMock();
       api.MetagameResourceApi res = new api.GamesApi(mock).metagame;
       var arg_consistencyToken = "foo";
@@ -5042,11 +5098,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("metagameConfig"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("metagameConfig"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -5059,28 +5118,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMetagameConfig());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getMetagameConfig(consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.MetagameConfig response) {
+      res
+          .getMetagameConfig(consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1(((api.MetagameConfig response) {
         checkMetagameConfig(response);
       })));
     });
 
     unittest.test("method--listCategoriesByPlayer", () {
-
       var mock = new HttpServerMock();
       api.MetagameResourceApi res = new api.GamesApi(mock).metagame;
       var arg_playerId = "foo";
@@ -5094,18 +5156,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/categories/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_playerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/categories/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/categories/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5121,35 +5188,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCategoryListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listCategoriesByPlayer(arg_playerId, arg_collection, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.CategoryListResponse response) {
+      res
+          .listCategoriesByPlayer(arg_playerId, arg_collection,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.CategoryListResponse response) {
         checkCategoryListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PlayersResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.PlayersResourceApi res = new api.GamesApi(mock).players;
       var arg_playerId = "foo";
@@ -5160,11 +5235,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("players/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5180,29 +5258,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_playerId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Player response) {
+      res
+          .get(arg_playerId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Player response) {
         checkPlayer(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PlayersResourceApi res = new api.GamesApi(mock).players;
       var arg_collection = "foo";
@@ -5215,11 +5298,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("players/me/players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("players/me/players/"));
         pathOffset += 19;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5235,35 +5321,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_collection, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PlayerListResponse response) {
+      res
+          .list(arg_collection,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.PlayerListResponse response) {
         checkPlayerListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PushtokensResourceApi", () {
     unittest.test("method--remove", () {
-
       var mock = new HttpServerMock();
       api.PushtokensResourceApi res = new api.GamesApi(mock).pushtokens;
       var arg_request = buildPushTokenId();
@@ -5276,11 +5370,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("pushtokens/remove"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("pushtokens/remove"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -5293,26 +5390,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.remove(arg_request, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .remove(arg_request, consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.PushtokensResourceApi res = new api.GamesApi(mock).pushtokens;
       var arg_request = buildPushToken();
@@ -5325,11 +5425,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("pushtokens"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("pushtokens"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -5342,32 +5445,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .update(arg_request, consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-QuestMilestonesResourceApi", () {
     unittest.test("method--claim", () {
-
       var mock = new HttpServerMock();
-      api.QuestMilestonesResourceApi res = new api.GamesApi(mock).questMilestones;
+      api.QuestMilestonesResourceApi res =
+          new api.GamesApi(mock).questMilestones;
       var arg_questId = "foo";
       var arg_milestoneId = "foo";
       var arg_requestId = "foo";
@@ -5377,25 +5482,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/milestones/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_questId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/milestones/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/milestones/"));
         pathOffset += 12;
         index = path.indexOf("/claim", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_milestoneId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/claim"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/claim"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -5408,31 +5520,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.claim(arg_questId, arg_milestoneId, arg_requestId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .claim(arg_questId, arg_milestoneId, arg_requestId,
+              consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-QuestsResourceApi", () {
     unittest.test("method--accept", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesApi(mock).quests;
       var arg_questId = "foo";
@@ -5443,18 +5558,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/accept", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_questId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/accept"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/accept"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -5467,29 +5587,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildQuest());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.accept(arg_questId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Quest response) {
+      res
+          .accept(arg_questId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Quest response) {
         checkQuest(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesApi(mock).quests;
       var arg_playerId = "foo";
@@ -5502,18 +5627,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/quests", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_playerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/quests"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/quests"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -5526,35 +5656,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildQuestListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_playerId, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.QuestListResponse response) {
+      res
+          .list(arg_playerId,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.QuestListResponse response) {
         checkQuestListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RevisionsResourceApi", () {
     unittest.test("method--check", () {
-
       var mock = new HttpServerMock();
       api.RevisionsResourceApi res = new api.GamesApi(mock).revisions;
       var arg_clientRevision = "foo";
@@ -5564,11 +5702,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("revisions/check"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("revisions/check"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -5581,33 +5722,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientRevision"].first, unittest.equals(arg_clientRevision));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["clientRevision"].first,
+            unittest.equals(arg_clientRevision));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRevisionCheckResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.check(arg_clientRevision, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1(((api.RevisionCheckResponse response) {
+      res
+          .check(arg_clientRevision, consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1(((api.RevisionCheckResponse response) {
         checkRevisionCheckResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-RoomsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_request = buildRoomCreateRequest();
@@ -5621,11 +5764,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("rooms/create"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("rooms/create"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -5638,29 +5784,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoom());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Room response) {
+      res
+          .create(arg_request,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Room response) {
         checkRoom(response);
       })));
     });
 
     unittest.test("method--decline", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_roomId = "foo";
@@ -5671,18 +5822,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/decline", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_roomId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/decline"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/decline"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5695,29 +5851,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoom());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.decline(arg_roomId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Room response) {
+      res
+          .decline(arg_roomId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Room response) {
         checkRoom(response);
       })));
     });
 
     unittest.test("method--dismiss", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_roomId = "foo";
@@ -5727,18 +5888,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/dismiss", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_roomId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/dismiss"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/dismiss"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5751,26 +5917,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.dismiss(arg_roomId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .dismiss(arg_roomId, consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_roomId = "foo";
@@ -5781,11 +5950,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("rooms/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5801,29 +5973,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoom());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_roomId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Room response) {
+      res
+          .get(arg_roomId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Room response) {
         checkRoom(response);
       })));
     });
 
     unittest.test("method--join", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_request = buildRoomJoinRequest();
@@ -5838,18 +6015,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/join", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_roomId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/join"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/join"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -5862,29 +6044,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoom());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.join(arg_request, arg_roomId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Room response) {
+      res
+          .join(arg_request, arg_roomId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Room response) {
         checkRoom(response);
       })));
     });
 
     unittest.test("method--leave", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_request = buildRoomLeaveRequest();
@@ -5899,18 +6086,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/leave", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_roomId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/leave"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/leave"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -5923,29 +6115,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoom());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.leave(arg_request, arg_roomId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Room response) {
+      res
+          .leave(arg_request, arg_roomId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Room response) {
         checkRoom(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_consistencyToken = "foo";
@@ -5957,11 +6154,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("rooms"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("rooms"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -5974,31 +6174,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoomList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.RoomList response) {
+      res
+          .list(
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.RoomList response) {
         checkRoomList(response);
       })));
     });
 
     unittest.test("method--reportStatus", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesApi(mock).rooms;
       var arg_request = buildRoomP2PStatuses();
@@ -6013,18 +6223,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/reportstatus", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_roomId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/reportstatus"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/reportstatus"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -6037,33 +6252,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRoomStatus());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reportStatus(arg_request, arg_roomId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.RoomStatus response) {
+      res
+          .reportStatus(arg_request, arg_roomId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.RoomStatus response) {
         checkRoomStatus(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ScoresResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesApi(mock).scores;
       var arg_playerId = "foo";
@@ -6079,25 +6297,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/leaderboards/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_playerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/leaderboards/"));
         pathOffset += 14;
         index = path.indexOf("/scores/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_leaderboardId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/scores/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/scores/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6113,32 +6338,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["includeRankType"].first, unittest.equals(arg_includeRankType));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(queryMap["includeRankType"].first,
+            unittest.equals(arg_includeRankType));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildPlayerLeaderboardScoreListResponse());
+        var resp =
+            convert.JSON.encode(buildPlayerLeaderboardScoreListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_playerId, arg_leaderboardId, arg_timeSpan, consistencyToken: arg_consistencyToken, includeRankType: arg_includeRankType, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PlayerLeaderboardScoreListResponse response) {
+      res
+          .get(arg_playerId, arg_leaderboardId, arg_timeSpan,
+              consistencyToken: arg_consistencyToken,
+              includeRankType: arg_includeRankType,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.PlayerLeaderboardScoreListResponse response) {
         checkPlayerLeaderboardScoreListResponse(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesApi(mock).scores;
       var arg_leaderboardId = "foo";
@@ -6153,18 +6392,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_leaderboardId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/scores/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/scores/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6180,32 +6424,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["timeSpan"].first, unittest.equals(arg_timeSpan));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["timeSpan"].first, unittest.equals(arg_timeSpan));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardScores());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_leaderboardId, arg_collection, arg_timeSpan, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LeaderboardScores response) {
+      res
+          .list(arg_leaderboardId, arg_collection, arg_timeSpan,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.LeaderboardScores response) {
         checkLeaderboardScores(response);
       })));
     });
 
     unittest.test("method--listWindow", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesApi(mock).scores;
       var arg_leaderboardId = "foo";
@@ -6222,18 +6477,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/window/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_leaderboardId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/window/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/window/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6249,34 +6509,49 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["timeSpan"].first, unittest.equals(arg_timeSpan));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["resultsAbove"].first), unittest.equals(arg_resultsAbove));
-        unittest.expect(queryMap["returnTopIfAbsent"].first, unittest.equals("$arg_returnTopIfAbsent"));
-
+        unittest.expect(
+            queryMap["timeSpan"].first, unittest.equals(arg_timeSpan));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["resultsAbove"].first),
+            unittest.equals(arg_resultsAbove));
+        unittest.expect(queryMap["returnTopIfAbsent"].first,
+            unittest.equals("$arg_returnTopIfAbsent"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardScores());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listWindow(arg_leaderboardId, arg_collection, arg_timeSpan, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken, resultsAbove: arg_resultsAbove, returnTopIfAbsent: arg_returnTopIfAbsent).then(unittest.expectAsync1(((api.LeaderboardScores response) {
+      res
+          .listWindow(arg_leaderboardId, arg_collection, arg_timeSpan,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              resultsAbove: arg_resultsAbove,
+              returnTopIfAbsent: arg_returnTopIfAbsent)
+          .then(unittest.expectAsync1(((api.LeaderboardScores response) {
         checkLeaderboardScores(response);
       })));
     });
 
     unittest.test("method--submit", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesApi(mock).scores;
       var arg_leaderboardId = "foo";
@@ -6289,18 +6564,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_leaderboardId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/scores"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/scores"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -6313,31 +6593,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["score"].first, unittest.equals(arg_score));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(queryMap["scoreTag"].first, unittest.equals(arg_scoreTag));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(
+            queryMap["scoreTag"].first, unittest.equals(arg_scoreTag));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerScoreResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.submit(arg_leaderboardId, arg_score, consistencyToken: arg_consistencyToken, language: arg_language, scoreTag: arg_scoreTag).then(unittest.expectAsync1(((api.PlayerScoreResponse response) {
+      res
+          .submit(arg_leaderboardId, arg_score,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              scoreTag: arg_scoreTag)
+          .then(unittest.expectAsync1(((api.PlayerScoreResponse response) {
         checkPlayerScoreResponse(response);
       })));
     });
 
     unittest.test("method--submitMultiple", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesApi(mock).scores;
       var arg_request = buildPlayerScoreSubmissionList();
@@ -6351,11 +6639,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("leaderboards/scores"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("leaderboards/scores"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -6368,33 +6659,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerScoreListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.submitMultiple(arg_request, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.PlayerScoreListResponse response) {
+      res
+          .submitMultiple(arg_request,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.PlayerScoreListResponse response) {
         checkPlayerScoreListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SnapshotsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SnapshotsResourceApi res = new api.GamesApi(mock).snapshots;
       var arg_snapshotId = "foo";
@@ -6405,11 +6699,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("snapshots/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("snapshots/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6425,29 +6722,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSnapshot());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_snapshotId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.Snapshot response) {
+      res
+          .get(arg_snapshotId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.Snapshot response) {
         checkSnapshot(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SnapshotsResourceApi res = new api.GamesApi(mock).snapshots;
       var arg_playerId = "foo";
@@ -6460,18 +6762,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/snapshots", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_playerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/snapshots"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/snapshots"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -6484,37 +6791,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSnapshotListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_playerId, consistencyToken: arg_consistencyToken, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SnapshotListResponse response) {
+      res
+          .list(arg_playerId,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SnapshotListResponse response) {
         checkSnapshotListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TurnBasedMatchesResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6522,18 +6838,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/cancel", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/cancel"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/cancel"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -6546,28 +6867,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_matchId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .cancel(arg_matchId, consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_request = buildTurnBasedMatchCreateRequest();
       var arg_consistencyToken = "foo";
       var arg_language = "foo";
@@ -6579,11 +6904,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("turnbasedmatches/create"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("turnbasedmatches/create"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -6596,31 +6924,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .create(arg_request,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--decline", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       var arg_language = "foo";
@@ -6629,18 +6963,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/decline", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/decline"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/decline"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -6653,31 +6992,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.decline(arg_matchId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .decline(arg_matchId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--dismiss", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -6685,18 +7030,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/dismiss", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/dismiss"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/dismiss"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -6709,28 +7059,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.dismiss(arg_matchId, consistencyToken: arg_consistencyToken).then(unittest.expectAsync1((_) {}));
+      res
+          .dismiss(arg_matchId, consistencyToken: arg_consistencyToken)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--finish", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_request = buildTurnBasedMatchResults();
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
@@ -6743,18 +7097,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/finish", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/finish"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/finish"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -6767,31 +7126,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.finish(arg_request, arg_matchId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .finish(arg_request, arg_matchId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       var arg_includeMatchData = true;
@@ -6801,11 +7166,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6821,32 +7189,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["includeMatchData"].first, unittest.equals("$arg_includeMatchData"));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(queryMap["includeMatchData"].first,
+            unittest.equals("$arg_includeMatchData"));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_matchId, consistencyToken: arg_consistencyToken, includeMatchData: arg_includeMatchData, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .get(arg_matchId,
+              consistencyToken: arg_consistencyToken,
+              includeMatchData: arg_includeMatchData,
+              language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--join", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       var arg_language = "foo";
@@ -6855,18 +7232,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/join", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/join"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/join"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -6879,31 +7261,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.join(arg_matchId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .join(arg_matchId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--leave", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       var arg_language = "foo";
@@ -6912,18 +7300,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/leave", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/leave"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/leave"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -6936,31 +7329,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.leave(arg_matchId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .leave(arg_matchId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--leaveTurn", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_matchVersion = 42;
       var arg_consistencyToken = "foo";
@@ -6971,18 +7370,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/leaveTurn", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/leaveTurn"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/leaveTurn"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -6995,33 +7399,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["matchVersion"].first), unittest.equals(arg_matchVersion));
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(queryMap["pendingParticipantId"].first, unittest.equals(arg_pendingParticipantId));
-
+        unittest.expect(core.int.parse(queryMap["matchVersion"].first),
+            unittest.equals(arg_matchVersion));
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(queryMap["pendingParticipantId"].first,
+            unittest.equals(arg_pendingParticipantId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.leaveTurn(arg_matchId, arg_matchVersion, consistencyToken: arg_consistencyToken, language: arg_language, pendingParticipantId: arg_pendingParticipantId).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .leaveTurn(arg_matchId, arg_matchVersion,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              pendingParticipantId: arg_pendingParticipantId)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_consistencyToken = "foo";
       var arg_includeMatchData = true;
       var arg_language = "foo";
@@ -7033,11 +7447,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("turnbasedmatches"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("turnbasedmatches"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -7050,35 +7467,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["includeMatchData"].first, unittest.equals("$arg_includeMatchData"));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxCompletedMatches"].first), unittest.equals(arg_maxCompletedMatches));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(queryMap["includeMatchData"].first,
+            unittest.equals("$arg_includeMatchData"));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxCompletedMatches"].first),
+            unittest.equals(arg_maxCompletedMatches));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatchList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(consistencyToken: arg_consistencyToken, includeMatchData: arg_includeMatchData, language: arg_language, maxCompletedMatches: arg_maxCompletedMatches, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TurnBasedMatchList response) {
+      res
+          .list(
+              consistencyToken: arg_consistencyToken,
+              includeMatchData: arg_includeMatchData,
+              language: arg_language,
+              maxCompletedMatches: arg_maxCompletedMatches,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TurnBasedMatchList response) {
         checkTurnBasedMatchList(response);
       })));
     });
 
     unittest.test("method--rematch", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
       var arg_language = "foo";
@@ -7088,18 +7520,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/rematch", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/rematch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/rematch"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7112,32 +7549,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(queryMap["requestId"].first, unittest.equals(arg_requestId));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(
+            queryMap["requestId"].first, unittest.equals(arg_requestId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatchRematch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.rematch(arg_matchId, consistencyToken: arg_consistencyToken, language: arg_language, requestId: arg_requestId).then(unittest.expectAsync1(((api.TurnBasedMatchRematch response) {
+      res
+          .rematch(arg_matchId,
+              consistencyToken: arg_consistencyToken,
+              language: arg_language,
+              requestId: arg_requestId)
+          .then(unittest.expectAsync1(((api.TurnBasedMatchRematch response) {
         checkTurnBasedMatchRematch(response);
       })));
     });
 
     unittest.test("method--sync", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_consistencyToken = "foo";
       var arg_includeMatchData = true;
       var arg_language = "foo";
@@ -7149,11 +7595,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("turnbasedmatches/sync"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("turnbasedmatches/sync"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -7166,35 +7615,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["includeMatchData"].first, unittest.equals("$arg_includeMatchData"));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxCompletedMatches"].first), unittest.equals(arg_maxCompletedMatches));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(queryMap["includeMatchData"].first,
+            unittest.equals("$arg_includeMatchData"));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxCompletedMatches"].first),
+            unittest.equals(arg_maxCompletedMatches));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatchSync());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.sync(consistencyToken: arg_consistencyToken, includeMatchData: arg_includeMatchData, language: arg_language, maxCompletedMatches: arg_maxCompletedMatches, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TurnBasedMatchSync response) {
+      res
+          .sync(
+              consistencyToken: arg_consistencyToken,
+              includeMatchData: arg_includeMatchData,
+              language: arg_language,
+              maxCompletedMatches: arg_maxCompletedMatches,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TurnBasedMatchSync response) {
         checkTurnBasedMatchSync(response);
       })));
     });
 
     unittest.test("method--takeTurn", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesApi(mock).turnBasedMatches;
       var arg_request = buildTurnBasedMatchTurn();
       var arg_matchId = "foo";
       var arg_consistencyToken = "foo";
@@ -7207,18 +7671,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("games/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/turn", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matchId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/turn"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/turn"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -7231,29 +7700,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["consistencyToken"].first, unittest.equals(arg_consistencyToken));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-
+        unittest.expect(queryMap["consistencyToken"].first,
+            unittest.equals(arg_consistencyToken));
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTurnBasedMatch());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.takeTurn(arg_request, arg_matchId, consistencyToken: arg_consistencyToken, language: arg_language).then(unittest.expectAsync1(((api.TurnBasedMatch response) {
+      res
+          .takeTurn(arg_request, arg_matchId,
+              consistencyToken: arg_consistencyToken, language: arg_language)
+          .then(unittest.expectAsync1(((api.TurnBasedMatch response) {
         checkTurnBasedMatch(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
index 37fbdfb..00a0152 100644
--- a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
+++ b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
@@ -1,12 +1,10 @@
 library googleapis.gamesConfiguration.v1configuration.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/gamesconfiguration/v1configuration.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -139,7 +138,8 @@
   return o;
 }
 
-checkAchievementConfigurationListResponse(api.AchievementConfigurationListResponse o) {
+checkAchievementConfigurationListResponse(
+    api.AchievementConfigurationListResponse o) {
   buildCounterAchievementConfigurationListResponse++;
   if (buildCounterAchievementConfigurationListResponse < 3) {
     checkUnnamed755(o.items);
@@ -314,7 +314,8 @@
   return o;
 }
 
-checkLeaderboardConfigurationListResponse(api.LeaderboardConfigurationListResponse o) {
+checkLeaderboardConfigurationListResponse(
+    api.LeaderboardConfigurationListResponse o) {
   buildCounterLeaderboardConfigurationListResponse++;
   if (buildCounterLeaderboardConfigurationListResponse < 3) {
     checkUnnamed756(o.items);
@@ -381,7 +382,6 @@
   buildCounterLocalizedStringBundle--;
 }
 
-
 main() {
   unittest.group("obj-schema-AchievementConfiguration", () {
     unittest.test("to-json--from-json", () {
@@ -391,7 +391,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementConfigurationDetail", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementConfigurationDetail();
@@ -400,16 +399,15 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementConfigurationListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementConfigurationListResponse();
-      var od = new api.AchievementConfigurationListResponse.fromJson(o.toJson());
+      var od =
+          new api.AchievementConfigurationListResponse.fromJson(o.toJson());
       checkAchievementConfigurationListResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-GamesNumberAffixConfiguration", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesNumberAffixConfiguration();
@@ -418,7 +416,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GamesNumberFormatConfiguration", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesNumberFormatConfiguration();
@@ -427,7 +424,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageConfiguration", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageConfiguration();
@@ -436,7 +432,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardConfiguration", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardConfiguration();
@@ -445,7 +440,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardConfigurationDetail", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardConfigurationDetail();
@@ -454,16 +448,15 @@
     });
   });
 
-
   unittest.group("obj-schema-LeaderboardConfigurationListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLeaderboardConfigurationListResponse();
-      var od = new api.LeaderboardConfigurationListResponse.fromJson(o.toJson());
+      var od =
+          new api.LeaderboardConfigurationListResponse.fromJson(o.toJson());
       checkLeaderboardConfigurationListResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-LocalizedString", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocalizedString();
@@ -472,7 +465,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocalizedStringBundle", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocalizedStringBundle();
@@ -481,23 +473,25 @@
     });
   });
 
-
   unittest.group("resource-AchievementConfigurationsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.AchievementConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).achievementConfigurations;
+      api.AchievementConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).achievementConfigurations;
       var arg_achievementId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -513,16 +507,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -531,20 +526,23 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AchievementConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).achievementConfigurations;
+      api.AchievementConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).achievementConfigurations;
       var arg_achievementId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -560,29 +558,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_achievementId).then(unittest.expectAsync1(((api.AchievementConfiguration response) {
+      res
+          .get(arg_achievementId)
+          .then(unittest.expectAsync1(((api.AchievementConfiguration response) {
         checkAchievementConfiguration(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.AchievementConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).achievementConfigurations;
+      api.AchievementConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).achievementConfigurations;
       var arg_request = buildAchievementConfiguration();
       var arg_applicationId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -593,18 +594,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/achievements", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/achievements"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/achievements"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -617,29 +623,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_applicationId).then(unittest.expectAsync1(((api.AchievementConfiguration response) {
+      res
+          .insert(arg_request, arg_applicationId)
+          .then(unittest.expectAsync1(((api.AchievementConfiguration response) {
         checkAchievementConfiguration(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AchievementConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).achievementConfigurations;
+      api.AchievementConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).achievementConfigurations;
       var arg_applicationId = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -648,18 +657,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/achievements", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/achievements"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/achievements"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -672,31 +686,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildAchievementConfigurationListResponse());
+        var resp =
+            convert.JSON.encode(buildAchievementConfigurationListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_applicationId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.AchievementConfigurationListResponse response) {
+      res
+          .list(arg_applicationId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(
+              ((api.AchievementConfigurationListResponse response) {
         checkAchievementConfigurationListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.AchievementConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).achievementConfigurations;
+      api.AchievementConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).achievementConfigurations;
       var arg_request = buildAchievementConfiguration();
       var arg_achievementId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -707,11 +729,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -727,29 +752,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_achievementId).then(unittest.expectAsync1(((api.AchievementConfiguration response) {
+      res
+          .patch(arg_request, arg_achievementId)
+          .then(unittest.expectAsync1(((api.AchievementConfiguration response) {
         checkAchievementConfiguration(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.AchievementConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).achievementConfigurations;
+      api.AchievementConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).achievementConfigurations;
       var arg_request = buildAchievementConfiguration();
       var arg_achievementId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -760,11 +788,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -780,35 +811,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_achievementId).then(unittest.expectAsync1(((api.AchievementConfiguration response) {
+      res
+          .update(arg_request, arg_achievementId)
+          .then(unittest.expectAsync1(((api.AchievementConfiguration response) {
         checkAchievementConfiguration(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ImageConfigurationsResourceApi", () {
     unittest.test("method--upload", () {
       // TODO: Implement tests for media upload;
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.ImageConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).imageConfigurations;
+      api.ImageConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).imageConfigurations;
       var arg_resourceId = "foo";
       var arg_imageType = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -816,18 +849,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("images/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("images/"));
         pathOffset += 7;
         index = path.indexOf("/imageType/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/imageType/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/imageType/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -843,44 +881,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildImageConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.upload(arg_resourceId, arg_imageType).then(unittest.expectAsync1(((api.ImageConfiguration response) {
+      res
+          .upload(arg_resourceId, arg_imageType)
+          .then(unittest.expectAsync1(((api.ImageConfiguration response) {
         checkImageConfiguration(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LeaderboardConfigurationsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.LeaderboardConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).leaderboardConfigurations;
+      api.LeaderboardConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).leaderboardConfigurations;
       var arg_leaderboardId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -896,16 +938,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -914,20 +957,23 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.LeaderboardConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).leaderboardConfigurations;
+      api.LeaderboardConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).leaderboardConfigurations;
       var arg_leaderboardId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -943,29 +989,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_leaderboardId).then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
+      res
+          .get(arg_leaderboardId)
+          .then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
         checkLeaderboardConfiguration(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.LeaderboardConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).leaderboardConfigurations;
+      api.LeaderboardConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).leaderboardConfigurations;
       var arg_request = buildLeaderboardConfiguration();
       var arg_applicationId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -976,18 +1025,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/leaderboards", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/leaderboards"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/leaderboards"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1000,29 +1054,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_applicationId).then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
+      res
+          .insert(arg_request, arg_applicationId)
+          .then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
         checkLeaderboardConfiguration(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.LeaderboardConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).leaderboardConfigurations;
+      api.LeaderboardConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).leaderboardConfigurations;
       var arg_applicationId = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -1031,18 +1088,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/leaderboards", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/leaderboards"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/leaderboards"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1055,31 +1117,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildLeaderboardConfigurationListResponse());
+        var resp =
+            convert.JSON.encode(buildLeaderboardConfigurationListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_applicationId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LeaderboardConfigurationListResponse response) {
+      res
+          .list(arg_applicationId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(
+              ((api.LeaderboardConfigurationListResponse response) {
         checkLeaderboardConfigurationListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.LeaderboardConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).leaderboardConfigurations;
+      api.LeaderboardConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).leaderboardConfigurations;
       var arg_request = buildLeaderboardConfiguration();
       var arg_leaderboardId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1090,11 +1160,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1110,29 +1183,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_leaderboardId).then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
+      res
+          .patch(arg_request, arg_leaderboardId)
+          .then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
         checkLeaderboardConfiguration(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.LeaderboardConfigurationsResourceApi res = new api.GamesConfigurationApi(mock).leaderboardConfigurations;
+      api.LeaderboardConfigurationsResourceApi res =
+          new api.GamesConfigurationApi(mock).leaderboardConfigurations;
       var arg_request = buildLeaderboardConfiguration();
       var arg_leaderboardId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1143,11 +1219,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("games/v1configuration/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("games/v1configuration/"));
         pathOffset += 22;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1163,27 +1242,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLeaderboardConfiguration());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_leaderboardId).then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
+      res
+          .update(arg_request, arg_leaderboardId)
+          .then(unittest.expectAsync1(((api.LeaderboardConfiguration response) {
         checkLeaderboardConfiguration(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index 70a1f7e..d270a51 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -1,12 +1,10 @@
 library googleapis.gamesManagement.v1management.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/gamesmanagement/v1management.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -110,7 +109,8 @@
   return o;
 }
 
-checkAchievementResetMultipleForAllRequest(api.AchievementResetMultipleForAllRequest o) {
+checkAchievementResetMultipleForAllRequest(
+    api.AchievementResetMultipleForAllRequest o) {
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
     checkUnnamed748(o.achievementIds);
@@ -213,7 +213,8 @@
   return o;
 }
 
-checkGamesPlayerExperienceInfoResource(api.GamesPlayerExperienceInfoResource o) {
+checkGamesPlayerExperienceInfoResource(
+    api.GamesPlayerExperienceInfoResource o) {
   buildCounterGamesPlayerExperienceInfoResource++;
   if (buildCounterGamesPlayerExperienceInfoResource < 3) {
     unittest.expect(o.currentExperiencePoints, unittest.equals('foo'));
@@ -527,7 +528,6 @@
   buildCounterScoresResetMultipleForAllRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AchievementResetAllResponse", () {
     unittest.test("to-json--from-json", () {
@@ -537,16 +537,15 @@
     });
   });
 
-
   unittest.group("obj-schema-AchievementResetMultipleForAllRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementResetMultipleForAllRequest();
-      var od = new api.AchievementResetMultipleForAllRequest.fromJson(o.toJson());
+      var od =
+          new api.AchievementResetMultipleForAllRequest.fromJson(o.toJson());
       checkAchievementResetMultipleForAllRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-AchievementResetResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAchievementResetResponse();
@@ -555,7 +554,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EventsResetMultipleForAllRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventsResetMultipleForAllRequest();
@@ -564,7 +562,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GamesPlayedResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesPlayedResource();
@@ -573,7 +570,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GamesPlayerExperienceInfoResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesPlayerExperienceInfoResource();
@@ -582,7 +578,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GamesPlayerLevelResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesPlayerLevelResource();
@@ -591,7 +586,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HiddenPlayer", () {
     unittest.test("to-json--from-json", () {
       var o = buildHiddenPlayer();
@@ -600,7 +594,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HiddenPlayerList", () {
     unittest.test("to-json--from-json", () {
       var o = buildHiddenPlayerList();
@@ -609,7 +602,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerName", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerName();
@@ -618,7 +610,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Player", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayer();
@@ -627,7 +618,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerScoreResetAllResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScoreResetAllResponse();
@@ -636,7 +626,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlayerScoreResetResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScoreResetResponse();
@@ -645,7 +634,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProfileSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildProfileSettings();
@@ -654,7 +642,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuestsResetMultipleForAllRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuestsResetMultipleForAllRequest();
@@ -663,7 +650,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ScoresResetMultipleForAllRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildScoresResetMultipleForAllRequest();
@@ -672,30 +658,34 @@
     });
   });
 
-
   unittest.group("resource-AchievementsResourceApi", () {
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
-      api.AchievementsResourceApi res = new api.GamesManagementApi(mock).achievements;
+      api.AchievementsResourceApi res =
+          new api.GamesManagementApi(mock).achievements;
       var arg_achievementId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/reset", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_achievementId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/reset"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -708,39 +698,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementResetResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reset(arg_achievementId).then(unittest.expectAsync1(((api.AchievementResetResponse response) {
+      res
+          .reset(arg_achievementId)
+          .then(unittest.expectAsync1(((api.AchievementResetResponse response) {
         checkAchievementResetResponse(response);
       })));
     });
 
     unittest.test("method--resetAll", () {
-
       var mock = new HttpServerMock();
-      api.AchievementsResourceApi res = new api.GamesManagementApi(mock).achievements;
+      api.AchievementsResourceApi res =
+          new api.GamesManagementApi(mock).achievements;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("achievements/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("achievements/reset"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -753,39 +749,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAchievementResetAllResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetAll().then(unittest.expectAsync1(((api.AchievementResetAllResponse response) {
+      res.resetAll().then(
+          unittest.expectAsync1(((api.AchievementResetAllResponse response) {
         checkAchievementResetAllResponse(response);
       })));
     });
 
     unittest.test("method--resetAllForAllPlayers", () {
-
       var mock = new HttpServerMock();
-      api.AchievementsResourceApi res = new api.GamesManagementApi(mock).achievements;
+      api.AchievementsResourceApi res =
+          new api.GamesManagementApi(mock).achievements;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("achievements/resetAllForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 34),
+            unittest.equals("achievements/resetAllForAllPlayers"));
         pathOffset += 34;
 
         var query = (req.url).query;
@@ -798,16 +799,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -816,27 +818,32 @@
     });
 
     unittest.test("method--resetForAllPlayers", () {
-
       var mock = new HttpServerMock();
-      api.AchievementsResourceApi res = new api.GamesManagementApi(mock).achievements;
+      api.AchievementsResourceApi res =
+          new api.GamesManagementApi(mock).achievements;
       var arg_achievementId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/resetForAllPlayers", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_achievementId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/resetForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/resetForAllPlayers"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -849,27 +856,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetForAllPlayers(arg_achievementId).then(unittest.expectAsync1((_) {}));
+      res
+          .resetForAllPlayers(arg_achievementId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--resetMultipleForAllPlayers", () {
-
       var mock = new HttpServerMock();
-      api.AchievementsResourceApi res = new api.GamesManagementApi(mock).achievements;
+      api.AchievementsResourceApi res =
+          new api.GamesManagementApi(mock).achievements;
       var arg_request = buildAchievementResetMultipleForAllRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.AchievementResetMultipleForAllRequest.fromJson(json);
@@ -879,11 +889,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 39), unittest.equals("achievements/resetMultipleForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 39),
+            unittest.equals("achievements/resetMultipleForAllPlayers"));
         pathOffset += 39;
 
         var query = (req.url).query;
@@ -896,31 +909,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync1((_) {}));
+      res
+          .resetMultipleForAllPlayers(arg_request)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-ApplicationsResourceApi", () {
     unittest.test("method--listHidden", () {
-
       var mock = new HttpServerMock();
-      api.ApplicationsResourceApi res = new api.GamesManagementApi(mock).applications;
+      api.ApplicationsResourceApi res =
+          new api.GamesManagementApi(mock).applications;
       var arg_applicationId = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -929,18 +943,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/players/hidden", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/players/hidden"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/players/hidden"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -953,33 +972,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHiddenPlayerList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listHidden(arg_applicationId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.HiddenPlayerList response) {
+      res
+          .listHidden(arg_applicationId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.HiddenPlayerList response) {
         checkHiddenPlayerList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EventsResourceApi", () {
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
       var arg_eventId = "foo";
@@ -988,18 +1010,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("events/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("events/"));
         pathOffset += 7;
         index = path.indexOf("/reset", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_eventId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/reset"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1012,16 +1039,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1030,7 +1058,6 @@
     });
 
     unittest.test("method--resetAll", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1038,11 +1065,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("events/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("events/reset"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1055,16 +1085,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1073,7 +1104,6 @@
     });
 
     unittest.test("method--resetAllForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1081,11 +1111,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("events/resetAllForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 28),
+            unittest.equals("events/resetAllForAllPlayers"));
         pathOffset += 28;
 
         var query = (req.url).query;
@@ -1098,16 +1131,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1116,7 +1150,6 @@
     });
 
     unittest.test("method--resetForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
       var arg_eventId = "foo";
@@ -1125,18 +1158,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("events/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("events/"));
         pathOffset += 7;
         index = path.indexOf("/resetForAllPlayers", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_eventId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/resetForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/resetForAllPlayers"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -1149,16 +1187,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1167,7 +1206,6 @@
     });
 
     unittest.test("method--resetMultipleForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
       var arg_request = buildEventsResetMultipleForAllRequest();
@@ -1179,11 +1217,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("events/resetMultipleForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 33),
+            unittest.equals("events/resetMultipleForAllPlayers"));
         pathOffset += 33;
 
         var query = (req.url).query;
@@ -1196,29 +1237,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync1((_) {}));
+      res
+          .resetMultipleForAllPlayers(arg_request)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-PlayersResourceApi", () {
     unittest.test("method--hide", () {
-
       var mock = new HttpServerMock();
       api.PlayersResourceApi res = new api.GamesManagementApi(mock).players;
       var arg_applicationId = "foo";
@@ -1228,18 +1269,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/players/hidden/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/players/hidden/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/players/hidden/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1255,25 +1301,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.hide(arg_applicationId, arg_playerId).then(unittest.expectAsync1((_) {}));
+      res
+          .hide(arg_applicationId, arg_playerId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--unhide", () {
-
       var mock = new HttpServerMock();
       api.PlayersResourceApi res = new api.GamesManagementApi(mock).players;
       var arg_applicationId = "foo";
@@ -1283,18 +1331,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/players/hidden/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_applicationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/players/hidden/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/players/hidden/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1310,29 +1363,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unhide(arg_applicationId, arg_playerId).then(unittest.expectAsync1((_) {}));
+      res
+          .unhide(arg_applicationId, arg_playerId)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-QuestsResourceApi", () {
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
       var arg_questId = "foo";
@@ -1341,18 +1394,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/reset", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_questId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/reset"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1365,16 +1423,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1383,7 +1442,6 @@
     });
 
     unittest.test("method--resetAll", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1391,11 +1449,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("quests/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("quests/reset"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1408,16 +1469,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1426,7 +1488,6 @@
     });
 
     unittest.test("method--resetAllForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1434,11 +1495,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("quests/resetAllForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 28),
+            unittest.equals("quests/resetAllForAllPlayers"));
         pathOffset += 28;
 
         var query = (req.url).query;
@@ -1451,16 +1515,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1469,7 +1534,6 @@
     });
 
     unittest.test("method--resetForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
       var arg_questId = "foo";
@@ -1478,18 +1542,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/resetForAllPlayers", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_questId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/resetForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("/resetForAllPlayers"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -1502,16 +1571,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1520,7 +1590,6 @@
     });
 
     unittest.test("method--resetMultipleForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
       var arg_request = buildQuestsResetMultipleForAllRequest();
@@ -1532,11 +1601,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("quests/resetMultipleForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 33),
+            unittest.equals("quests/resetMultipleForAllPlayers"));
         pathOffset += 33;
 
         var query = (req.url).query;
@@ -1549,29 +1621,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync1((_) {}));
+      res
+          .resetMultipleForAllPlayers(arg_request)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-RoomsResourceApi", () {
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesManagementApi(mock).rooms;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1579,11 +1651,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("rooms/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("rooms/reset"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -1596,16 +1671,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1614,7 +1690,6 @@
     });
 
     unittest.test("method--resetForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.RoomsResourceApi res = new api.GamesManagementApi(mock).rooms;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1622,11 +1697,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("rooms/resetForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("rooms/resetForAllPlayers"));
         pathOffset += 24;
 
         var query = (req.url).query;
@@ -1639,29 +1717,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.resetForAllPlayers().then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-ScoresResourceApi", () {
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
       var arg_leaderboardId = "foo";
@@ -1670,18 +1746,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores/reset", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_leaderboardId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/scores/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/scores/reset"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1694,27 +1775,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerScoreResetResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reset(arg_leaderboardId).then(unittest.expectAsync1(((api.PlayerScoreResetResponse response) {
+      res
+          .reset(arg_leaderboardId)
+          .then(unittest.expectAsync1(((api.PlayerScoreResetResponse response) {
         checkPlayerScoreResetResponse(response);
       })));
     });
 
     unittest.test("method--resetAll", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1722,11 +1805,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("scores/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("scores/reset"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1739,27 +1825,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlayerScoreResetAllResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetAll().then(unittest.expectAsync1(((api.PlayerScoreResetAllResponse response) {
+      res.resetAll().then(
+          unittest.expectAsync1(((api.PlayerScoreResetAllResponse response) {
         checkPlayerScoreResetAllResponse(response);
       })));
     });
 
     unittest.test("method--resetAllForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1767,11 +1854,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("scores/resetAllForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 28),
+            unittest.equals("scores/resetAllForAllPlayers"));
         pathOffset += 28;
 
         var query = (req.url).query;
@@ -1784,16 +1874,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1802,7 +1893,6 @@
     });
 
     unittest.test("method--resetForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
       var arg_leaderboardId = "foo";
@@ -1811,18 +1901,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores/resetForAllPlayers", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_leaderboardId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/scores/resetForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("/scores/resetForAllPlayers"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -1835,25 +1930,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetForAllPlayers(arg_leaderboardId).then(unittest.expectAsync1((_) {}));
+      res
+          .resetForAllPlayers(arg_leaderboardId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--resetMultipleForAllPlayers", () {
-
       var mock = new HttpServerMock();
       api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
       var arg_request = buildScoresResetMultipleForAllRequest();
@@ -1865,11 +1962,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("scores/resetMultipleForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 33),
+            unittest.equals("scores/resetMultipleForAllPlayers"));
         pathOffset += 33;
 
         var query = (req.url).query;
@@ -1882,41 +1982,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync1((_) {}));
+      res
+          .resetMultipleForAllPlayers(arg_request)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-TurnBasedMatchesResourceApi", () {
     unittest.test("method--reset", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesManagementApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesManagementApi(mock).turnBasedMatches;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("turnbasedmatches/reset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("turnbasedmatches/reset"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -1929,16 +2033,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1947,19 +2052,22 @@
     });
 
     unittest.test("method--resetForAllPlayers", () {
-
       var mock = new HttpServerMock();
-      api.TurnBasedMatchesResourceApi res = new api.GamesManagementApi(mock).turnBasedMatches;
+      api.TurnBasedMatchesResourceApi res =
+          new api.GamesManagementApi(mock).turnBasedMatches;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("games/v1management/"));
         pathOffset += 19;
-        unittest.expect(path.substring(pathOffset, pathOffset + 35), unittest.equals("turnbasedmatches/resetForAllPlayers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 35),
+            unittest.equals("turnbasedmatches/resetForAllPlayers"));
         pathOffset += 35;
 
         var query = (req.url).query;
@@ -1972,25 +2080,22 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.resetForAllPlayers().then(unittest.expectAsync1((_) {}));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/genomics/v1_test.dart b/generated/googleapis/test/genomics/v1_test.dart
index e87f427..3b0b7b7 100644
--- a/generated/googleapis/test/genomics/v1_test.dart
+++ b/generated/googleapis/test/genomics/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.genomics.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/genomics/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,36 +44,52 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2549() {
+buildUnnamed2536() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2549(core.List<core.Object> o) {
+checkUnnamed2536(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2550() {
+buildUnnamed2537() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2549();
-  o["y"] = buildUnnamed2549();
+  o["x"] = buildUnnamed2536();
+  o["y"] = buildUnnamed2536();
   return o;
 }
 
-checkUnnamed2550(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2537(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2549(o["x"]);
-  checkUnnamed2549(o["y"]);
+  checkUnnamed2536(o["x"]);
+  checkUnnamed2536(o["y"]);
 }
 
 core.int buildCounterAnnotation = 0;
@@ -85,7 +100,7 @@
     o.annotationSetId = "foo";
     o.end = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2550();
+    o.info = buildUnnamed2537();
     o.name = "foo";
     o.referenceId = "foo";
     o.referenceName = "foo";
@@ -105,7 +120,7 @@
     unittest.expect(o.annotationSetId, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2550(o.info);
+    checkUnnamed2537(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.referenceId, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -118,30 +133,46 @@
   buildCounterAnnotation--;
 }
 
-buildUnnamed2551() {
+buildUnnamed2538() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2551(core.List<core.Object> o) {
+checkUnnamed2538(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o[0]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o[1]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2552() {
+buildUnnamed2539() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2551();
-  o["y"] = buildUnnamed2551();
+  o["x"] = buildUnnamed2538();
+  o["y"] = buildUnnamed2538();
   return o;
 }
 
-checkUnnamed2552(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2539(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2551(o["x"]);
-  checkUnnamed2551(o["y"]);
+  checkUnnamed2538(o["x"]);
+  checkUnnamed2538(o["y"]);
 }
 
 core.int buildCounterAnnotationSet = 0;
@@ -151,7 +182,7 @@
   if (buildCounterAnnotationSet < 3) {
     o.datasetId = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2552();
+    o.info = buildUnnamed2539();
     o.name = "foo";
     o.referenceSetId = "foo";
     o.sourceUri = "foo";
@@ -166,7 +197,7 @@
   if (buildCounterAnnotationSet < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2552(o.info);
+    checkUnnamed2539(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
     unittest.expect(o.sourceUri, unittest.equals('foo'));
@@ -175,14 +206,14 @@
   buildCounterAnnotationSet--;
 }
 
-buildUnnamed2553() {
+buildUnnamed2540() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed2553(core.List<api.Annotation> o) {
+checkUnnamed2540(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -193,7 +224,7 @@
   var o = new api.BatchCreateAnnotationsRequest();
   buildCounterBatchCreateAnnotationsRequest++;
   if (buildCounterBatchCreateAnnotationsRequest < 3) {
-    o.annotations = buildUnnamed2553();
+    o.annotations = buildUnnamed2540();
     o.requestId = "foo";
   }
   buildCounterBatchCreateAnnotationsRequest--;
@@ -203,20 +234,20 @@
 checkBatchCreateAnnotationsRequest(api.BatchCreateAnnotationsRequest o) {
   buildCounterBatchCreateAnnotationsRequest++;
   if (buildCounterBatchCreateAnnotationsRequest < 3) {
-    checkUnnamed2553(o.annotations);
+    checkUnnamed2540(o.annotations);
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
   buildCounterBatchCreateAnnotationsRequest--;
 }
 
-buildUnnamed2554() {
+buildUnnamed2541() {
   var o = new core.List<api.Entry>();
   o.add(buildEntry());
   o.add(buildEntry());
   return o;
 }
 
-checkUnnamed2554(core.List<api.Entry> o) {
+checkUnnamed2541(core.List<api.Entry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntry(o[0]);
   checkEntry(o[1]);
@@ -227,7 +258,7 @@
   var o = new api.BatchCreateAnnotationsResponse();
   buildCounterBatchCreateAnnotationsResponse++;
   if (buildCounterBatchCreateAnnotationsResponse < 3) {
-    o.entries = buildUnnamed2554();
+    o.entries = buildUnnamed2541();
   }
   buildCounterBatchCreateAnnotationsResponse--;
   return o;
@@ -236,19 +267,19 @@
 checkBatchCreateAnnotationsResponse(api.BatchCreateAnnotationsResponse o) {
   buildCounterBatchCreateAnnotationsResponse++;
   if (buildCounterBatchCreateAnnotationsResponse < 3) {
-    checkUnnamed2554(o.entries);
+    checkUnnamed2541(o.entries);
   }
   buildCounterBatchCreateAnnotationsResponse--;
 }
 
-buildUnnamed2555() {
+buildUnnamed2542() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2555(core.List<core.String> o) {
+checkUnnamed2542(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -259,7 +290,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed2555();
+    o.members = buildUnnamed2542();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -269,46 +300,62 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed2555(o.members);
+    checkUnnamed2542(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed2556() {
+buildUnnamed2543() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2556(core.List<core.Object> o) {
+checkUnnamed2543(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o[0]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o[1]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2557() {
+buildUnnamed2544() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2556();
-  o["y"] = buildUnnamed2556();
+  o["x"] = buildUnnamed2543();
+  o["y"] = buildUnnamed2543();
   return o;
 }
 
-checkUnnamed2557(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2544(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2556(o["x"]);
-  checkUnnamed2556(o["y"]);
+  checkUnnamed2543(o["x"]);
+  checkUnnamed2543(o["y"]);
 }
 
-buildUnnamed2558() {
+buildUnnamed2545() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2558(core.List<core.String> o) {
+checkUnnamed2545(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -321,10 +368,10 @@
   if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2557();
+    o.info = buildUnnamed2544();
     o.name = "foo";
     o.sampleId = "foo";
-    o.variantSetIds = buildUnnamed2558();
+    o.variantSetIds = buildUnnamed2545();
   }
   buildCounterCallSet--;
   return o;
@@ -335,10 +382,10 @@
   if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2557(o.info);
+    checkUnnamed2544(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
-    checkUnnamed2558(o.variantSetIds);
+    checkUnnamed2545(o.variantSetIds);
   }
   buildCounterCallSet--;
 }
@@ -347,16 +394,14 @@
 buildCancelOperationRequest() {
   var o = new api.CancelOperationRequest();
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
   return o;
 }
 
 checkCancelOperationRequest(api.CancelOperationRequest o) {
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
 }
 
@@ -383,27 +428,27 @@
   buildCounterCigarUnit--;
 }
 
-buildUnnamed2559() {
+buildUnnamed2546() {
   var o = new core.List<api.ExternalId>();
   o.add(buildExternalId());
   o.add(buildExternalId());
   return o;
 }
 
-checkUnnamed2559(core.List<api.ExternalId> o) {
+checkUnnamed2546(core.List<api.ExternalId> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExternalId(o[0]);
   checkExternalId(o[1]);
 }
 
-buildUnnamed2560() {
+buildUnnamed2547() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2560(core.List<core.String> o) {
+checkUnnamed2547(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -415,8 +460,8 @@
   buildCounterClinicalCondition++;
   if (buildCounterClinicalCondition < 3) {
     o.conceptId = "foo";
-    o.externalIds = buildUnnamed2559();
-    o.names = buildUnnamed2560();
+    o.externalIds = buildUnnamed2546();
+    o.names = buildUnnamed2547();
     o.omimId = "foo";
   }
   buildCounterClinicalCondition--;
@@ -427,8 +472,8 @@
   buildCounterClinicalCondition++;
   if (buildCounterClinicalCondition < 3) {
     unittest.expect(o.conceptId, unittest.equals('foo'));
-    checkUnnamed2559(o.externalIds);
-    checkUnnamed2560(o.names);
+    checkUnnamed2546(o.externalIds);
+    checkUnnamed2547(o.names);
     unittest.expect(o.omimId, unittest.equals('foo'));
   }
   buildCounterClinicalCondition--;
@@ -455,14 +500,14 @@
   buildCounterCodingSequence--;
 }
 
-buildUnnamed2561() {
+buildUnnamed2548() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2561(core.List<core.String> o) {
+checkUnnamed2548(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -473,7 +518,7 @@
   var o = new api.ComputeEngine();
   buildCounterComputeEngine++;
   if (buildCounterComputeEngine < 3) {
-    o.diskNames = buildUnnamed2561();
+    o.diskNames = buildUnnamed2548();
     o.instanceName = "foo";
     o.machineType = "foo";
     o.zone = "foo";
@@ -485,7 +530,7 @@
 checkComputeEngine(api.ComputeEngine o) {
   buildCounterComputeEngine++;
   if (buildCounterComputeEngine < 3) {
-    checkUnnamed2561(o.diskNames);
+    checkUnnamed2548(o.diskNames);
     unittest.expect(o.instanceName, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
@@ -543,16 +588,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -625,14 +668,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed2562() {
+buildUnnamed2549() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2562(core.List<core.String> o) {
+checkUnnamed2549(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -645,7 +688,7 @@
   if (buildCounterExportReadGroupSetRequest < 3) {
     o.exportUri = "foo";
     o.projectId = "foo";
-    o.referenceNames = buildUnnamed2562();
+    o.referenceNames = buildUnnamed2549();
   }
   buildCounterExportReadGroupSetRequest--;
   return o;
@@ -656,19 +699,19 @@
   if (buildCounterExportReadGroupSetRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed2562(o.referenceNames);
+    checkUnnamed2549(o.referenceNames);
   }
   buildCounterExportReadGroupSetRequest--;
 }
 
-buildUnnamed2563() {
+buildUnnamed2550() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2563(core.List<core.String> o) {
+checkUnnamed2550(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -681,7 +724,7 @@
   if (buildCounterExportVariantSetRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callSetIds = buildUnnamed2563();
+    o.callSetIds = buildUnnamed2550();
     o.format = "foo";
     o.projectId = "foo";
   }
@@ -694,7 +737,7 @@
   if (buildCounterExportVariantSetRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed2563(o.callSetIds);
+    checkUnnamed2550(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
   }
@@ -726,27 +769,25 @@
 buildGetIamPolicyRequest() {
   var o = new api.GetIamPolicyRequest();
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
   return o;
 }
 
 checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed2564() {
+buildUnnamed2551() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2564(core.List<core.String> o) {
+checkUnnamed2551(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -760,7 +801,7 @@
     o.datasetId = "foo";
     o.partitionStrategy = "foo";
     o.referenceSetId = "foo";
-    o.sourceUris = buildUnnamed2564();
+    o.sourceUris = buildUnnamed2551();
   }
   buildCounterImportReadGroupSetsRequest--;
   return o;
@@ -772,19 +813,19 @@
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.partitionStrategy, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
-    checkUnnamed2564(o.sourceUris);
+    checkUnnamed2551(o.sourceUris);
   }
   buildCounterImportReadGroupSetsRequest--;
 }
 
-buildUnnamed2565() {
+buildUnnamed2552() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2565(core.List<core.String> o) {
+checkUnnamed2552(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -795,7 +836,7 @@
   var o = new api.ImportReadGroupSetsResponse();
   buildCounterImportReadGroupSetsResponse++;
   if (buildCounterImportReadGroupSetsResponse < 3) {
-    o.readGroupSetIds = buildUnnamed2565();
+    o.readGroupSetIds = buildUnnamed2552();
   }
   buildCounterImportReadGroupSetsResponse--;
   return o;
@@ -804,32 +845,32 @@
 checkImportReadGroupSetsResponse(api.ImportReadGroupSetsResponse o) {
   buildCounterImportReadGroupSetsResponse++;
   if (buildCounterImportReadGroupSetsResponse < 3) {
-    checkUnnamed2565(o.readGroupSetIds);
+    checkUnnamed2552(o.readGroupSetIds);
   }
   buildCounterImportReadGroupSetsResponse--;
 }
 
-buildUnnamed2566() {
+buildUnnamed2553() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2566(core.Map<core.String, core.String> o) {
+checkUnnamed2553(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2567() {
+buildUnnamed2554() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2567(core.List<core.String> o) {
+checkUnnamed2554(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -841,9 +882,9 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.infoMergeConfig = buildUnnamed2566();
+    o.infoMergeConfig = buildUnnamed2553();
     o.normalizeReferenceNames = true;
-    o.sourceUris = buildUnnamed2567();
+    o.sourceUris = buildUnnamed2554();
     o.variantSetId = "foo";
   }
   buildCounterImportVariantsRequest--;
@@ -854,22 +895,22 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed2566(o.infoMergeConfig);
+    checkUnnamed2553(o.infoMergeConfig);
     unittest.expect(o.normalizeReferenceNames, unittest.isTrue);
-    checkUnnamed2567(o.sourceUris);
+    checkUnnamed2554(o.sourceUris);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterImportVariantsRequest--;
 }
 
-buildUnnamed2568() {
+buildUnnamed2555() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2568(core.List<core.String> o) {
+checkUnnamed2555(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -880,7 +921,7 @@
   var o = new api.ImportVariantsResponse();
   buildCounterImportVariantsResponse++;
   if (buildCounterImportVariantsResponse < 3) {
-    o.callSetIds = buildUnnamed2568();
+    o.callSetIds = buildUnnamed2555();
   }
   buildCounterImportVariantsResponse--;
   return o;
@@ -889,19 +930,19 @@
 checkImportVariantsResponse(api.ImportVariantsResponse o) {
   buildCounterImportVariantsResponse++;
   if (buildCounterImportVariantsResponse < 3) {
-    checkUnnamed2568(o.callSetIds);
+    checkUnnamed2555(o.callSetIds);
   }
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed2569() {
+buildUnnamed2556() {
   var o = new core.List<api.CigarUnit>();
   o.add(buildCigarUnit());
   o.add(buildCigarUnit());
   return o;
 }
 
-checkUnnamed2569(core.List<api.CigarUnit> o) {
+checkUnnamed2556(core.List<api.CigarUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCigarUnit(o[0]);
   checkCigarUnit(o[1]);
@@ -912,7 +953,7 @@
   var o = new api.LinearAlignment();
   buildCounterLinearAlignment++;
   if (buildCounterLinearAlignment < 3) {
-    o.cigar = buildUnnamed2569();
+    o.cigar = buildUnnamed2556();
     o.mappingQuality = 42;
     o.position = buildPosition();
   }
@@ -923,7 +964,7 @@
 checkLinearAlignment(api.LinearAlignment o) {
   buildCounterLinearAlignment++;
   if (buildCounterLinearAlignment < 3) {
-    checkUnnamed2569(o.cigar);
+    checkUnnamed2556(o.cigar);
     unittest.expect(o.mappingQuality, unittest.equals(42));
     checkPosition(o.position);
   }
@@ -953,14 +994,14 @@
   buildCounterListBasesResponse--;
 }
 
-buildUnnamed2570() {
+buildUnnamed2557() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed2570(core.List<api.CoverageBucket> o) {
+checkUnnamed2557(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -972,7 +1013,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed2570();
+    o.coverageBuckets = buildUnnamed2557();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -983,20 +1024,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed2570(o.coverageBuckets);
+    checkUnnamed2557(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed2571() {
+buildUnnamed2558() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed2571(core.List<api.Dataset> o) {
+checkUnnamed2558(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -1007,7 +1048,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed2571();
+    o.datasets = buildUnnamed2558();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -1017,20 +1058,20 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed2571(o.datasets);
+    checkUnnamed2558(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed2572() {
+buildUnnamed2559() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2572(core.List<api.Operation> o) {
+checkUnnamed2559(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1042,7 +1083,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2572();
+    o.operations = buildUnnamed2559();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1052,32 +1093,32 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2572(o.operations);
+    checkUnnamed2559(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed2573() {
+buildUnnamed2560() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2573(core.Map<core.String, core.String> o) {
+checkUnnamed2560(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2574() {
+buildUnnamed2561() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed2574(core.List<api.Variant> o) {
+checkUnnamed2561(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1088,9 +1129,9 @@
   var o = new api.MergeVariantsRequest();
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    o.infoMergeConfig = buildUnnamed2573();
+    o.infoMergeConfig = buildUnnamed2560();
     o.variantSetId = "foo";
-    o.variants = buildUnnamed2574();
+    o.variants = buildUnnamed2561();
   }
   buildCounterMergeVariantsRequest--;
   return o;
@@ -1099,37 +1140,69 @@
 checkMergeVariantsRequest(api.MergeVariantsRequest o) {
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    checkUnnamed2573(o.infoMergeConfig);
+    checkUnnamed2560(o.infoMergeConfig);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
-    checkUnnamed2574(o.variants);
+    checkUnnamed2561(o.variants);
   }
   buildCounterMergeVariantsRequest--;
 }
 
-buildUnnamed2575() {
+buildUnnamed2562() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2575(core.Map<core.String, core.Object> o) {
+checkUnnamed2562(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2576() {
+buildUnnamed2563() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2576(core.Map<core.String, core.Object> o) {
+checkUnnamed2563(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o["x"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o["y"]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+  var casted9 = (o["x"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o["y"]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -1139,9 +1212,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2575();
+    o.metadata = buildUnnamed2562();
     o.name = "foo";
-    o.response = buildUnnamed2576();
+    o.response = buildUnnamed2563();
   }
   buildCounterOperation--;
   return o;
@@ -1152,9 +1225,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2575(o.metadata);
+    checkUnnamed2562(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2576(o.response);
+    checkUnnamed2563(o.response);
   }
   buildCounterOperation--;
 }
@@ -1182,56 +1255,88 @@
   buildCounterOperationEvent--;
 }
 
-buildUnnamed2577() {
+buildUnnamed2564() {
   var o = new core.List<api.OperationEvent>();
   o.add(buildOperationEvent());
   o.add(buildOperationEvent());
   return o;
 }
 
-checkUnnamed2577(core.List<api.OperationEvent> o) {
+checkUnnamed2564(core.List<api.OperationEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationEvent(o[0]);
   checkOperationEvent(o[1]);
 }
 
-buildUnnamed2578() {
+buildUnnamed2565() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2578(core.Map<core.String, core.String> o) {
+checkUnnamed2565(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed2579() {
+buildUnnamed2566() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2579(core.Map<core.String, core.Object> o) {
+checkUnnamed2566(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted11 = (o["x"]) as core.Map; unittest.expect(casted11, unittest.hasLength(3)); unittest.expect(casted11["list"], unittest.equals([1, 2, 3])); unittest.expect(casted11["bool"], unittest.equals(true)); unittest.expect(casted11["string"], unittest.equals('foo')); 
-  var casted12 = (o["y"]) as core.Map; unittest.expect(casted12, unittest.hasLength(3)); unittest.expect(casted12["list"], unittest.equals([1, 2, 3])); unittest.expect(casted12["bool"], unittest.equals(true)); unittest.expect(casted12["string"], unittest.equals('foo')); 
+  var casted11 = (o["x"]) as core.Map;
+  unittest.expect(casted11, unittest.hasLength(3));
+  unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted11["bool"], unittest.equals(true));
+  unittest.expect(casted11["string"], unittest.equals('foo'));
+  var casted12 = (o["y"]) as core.Map;
+  unittest.expect(casted12, unittest.hasLength(3));
+  unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted12["bool"], unittest.equals(true));
+  unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2580() {
+buildUnnamed2567() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2580(core.Map<core.String, core.Object> o) {
+checkUnnamed2567(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted13 = (o["x"]) as core.Map; unittest.expect(casted13, unittest.hasLength(3)); unittest.expect(casted13["list"], unittest.equals([1, 2, 3])); unittest.expect(casted13["bool"], unittest.equals(true)); unittest.expect(casted13["string"], unittest.equals('foo')); 
-  var casted14 = (o["y"]) as core.Map; unittest.expect(casted14, unittest.hasLength(3)); unittest.expect(casted14["list"], unittest.equals([1, 2, 3])); unittest.expect(casted14["bool"], unittest.equals(true)); unittest.expect(casted14["string"], unittest.equals('foo')); 
+  var casted13 = (o["x"]) as core.Map;
+  unittest.expect(casted13, unittest.hasLength(3));
+  unittest.expect(casted13["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted13["bool"], unittest.equals(true));
+  unittest.expect(casted13["string"], unittest.equals('foo'));
+  var casted14 = (o["y"]) as core.Map;
+  unittest.expect(casted14, unittest.hasLength(3));
+  unittest.expect(casted14["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted14["bool"], unittest.equals(true));
+  unittest.expect(casted14["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperationMetadata = 0;
@@ -1242,11 +1347,11 @@
     o.clientId = "foo";
     o.createTime = "foo";
     o.endTime = "foo";
-    o.events = buildUnnamed2577();
-    o.labels = buildUnnamed2578();
+    o.events = buildUnnamed2564();
+    o.labels = buildUnnamed2565();
     o.projectId = "foo";
-    o.request = buildUnnamed2579();
-    o.runtimeMetadata = buildUnnamed2580();
+    o.request = buildUnnamed2566();
+    o.runtimeMetadata = buildUnnamed2567();
     o.startTime = "foo";
   }
   buildCounterOperationMetadata--;
@@ -1259,24 +1364,24 @@
     unittest.expect(o.clientId, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed2577(o.events);
-    checkUnnamed2578(o.labels);
+    checkUnnamed2564(o.events);
+    checkUnnamed2565(o.labels);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed2579(o.request);
-    checkUnnamed2580(o.runtimeMetadata);
+    checkUnnamed2566(o.request);
+    checkUnnamed2567(o.runtimeMetadata);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed2581() {
+buildUnnamed2568() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed2581(core.List<api.Binding> o) {
+checkUnnamed2568(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -1287,7 +1392,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed2581();
+    o.bindings = buildUnnamed2568();
     o.etag = "foo";
     o.version = 42;
   }
@@ -1298,7 +1403,7 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed2581(o.bindings);
+    checkUnnamed2568(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -1378,43 +1483,59 @@
   buildCounterRange--;
 }
 
-buildUnnamed2582() {
+buildUnnamed2569() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2582(core.List<core.int> o) {
+checkUnnamed2569(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed2583() {
+buildUnnamed2570() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2583(core.List<core.Object> o) {
+checkUnnamed2570(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted15 = (o[0]) as core.Map; unittest.expect(casted15, unittest.hasLength(3)); unittest.expect(casted15["list"], unittest.equals([1, 2, 3])); unittest.expect(casted15["bool"], unittest.equals(true)); unittest.expect(casted15["string"], unittest.equals('foo')); 
-  var casted16 = (o[1]) as core.Map; unittest.expect(casted16, unittest.hasLength(3)); unittest.expect(casted16["list"], unittest.equals([1, 2, 3])); unittest.expect(casted16["bool"], unittest.equals(true)); unittest.expect(casted16["string"], unittest.equals('foo')); 
+  var casted15 = (o[0]) as core.Map;
+  unittest.expect(casted15, unittest.hasLength(3));
+  unittest.expect(casted15["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted15["bool"], unittest.equals(true));
+  unittest.expect(casted15["string"], unittest.equals('foo'));
+  var casted16 = (o[1]) as core.Map;
+  unittest.expect(casted16, unittest.hasLength(3));
+  unittest.expect(casted16["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted16["bool"], unittest.equals(true));
+  unittest.expect(casted16["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2584() {
+buildUnnamed2571() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2583();
-  o["y"] = buildUnnamed2583();
+  o["x"] = buildUnnamed2570();
+  o["y"] = buildUnnamed2570();
   return o;
 }
 
-checkUnnamed2584(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2571(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2583(o["x"]);
-  checkUnnamed2583(o["y"]);
+  checkUnnamed2570(o["x"]);
+  checkUnnamed2570(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1422,7 +1543,7 @@
   var o = new api.Read();
   buildCounterRead++;
   if (buildCounterRead < 3) {
-    o.alignedQuality = buildUnnamed2582();
+    o.alignedQuality = buildUnnamed2569();
     o.alignedSequence = "foo";
     o.alignment = buildLinearAlignment();
     o.duplicateFragment = true;
@@ -1430,7 +1551,7 @@
     o.fragmentLength = 42;
     o.fragmentName = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2584();
+    o.info = buildUnnamed2571();
     o.nextMatePosition = buildPosition();
     o.numberReads = 42;
     o.properPlacement = true;
@@ -1447,7 +1568,7 @@
 checkRead(api.Read o) {
   buildCounterRead++;
   if (buildCounterRead < 3) {
-    checkUnnamed2582(o.alignedQuality);
+    checkUnnamed2569(o.alignedQuality);
     unittest.expect(o.alignedSequence, unittest.equals('foo'));
     checkLinearAlignment(o.alignment);
     unittest.expect(o.duplicateFragment, unittest.isTrue);
@@ -1455,7 +1576,7 @@
     unittest.expect(o.fragmentLength, unittest.equals(42));
     unittest.expect(o.fragmentName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2584(o.info);
+    checkUnnamed2571(o.info);
     checkPosition(o.nextMatePosition);
     unittest.expect(o.numberReads, unittest.equals(42));
     unittest.expect(o.properPlacement, unittest.isTrue);
@@ -1468,40 +1589,56 @@
   buildCounterRead--;
 }
 
-buildUnnamed2585() {
+buildUnnamed2572() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2585(core.List<core.Object> o) {
+checkUnnamed2572(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted17 = (o[0]) as core.Map; unittest.expect(casted17, unittest.hasLength(3)); unittest.expect(casted17["list"], unittest.equals([1, 2, 3])); unittest.expect(casted17["bool"], unittest.equals(true)); unittest.expect(casted17["string"], unittest.equals('foo')); 
-  var casted18 = (o[1]) as core.Map; unittest.expect(casted18, unittest.hasLength(3)); unittest.expect(casted18["list"], unittest.equals([1, 2, 3])); unittest.expect(casted18["bool"], unittest.equals(true)); unittest.expect(casted18["string"], unittest.equals('foo')); 
+  var casted17 = (o[0]) as core.Map;
+  unittest.expect(casted17, unittest.hasLength(3));
+  unittest.expect(casted17["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted17["bool"], unittest.equals(true));
+  unittest.expect(casted17["string"], unittest.equals('foo'));
+  var casted18 = (o[1]) as core.Map;
+  unittest.expect(casted18, unittest.hasLength(3));
+  unittest.expect(casted18["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted18["bool"], unittest.equals(true));
+  unittest.expect(casted18["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2586() {
+buildUnnamed2573() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2585();
-  o["y"] = buildUnnamed2585();
+  o["x"] = buildUnnamed2572();
+  o["y"] = buildUnnamed2572();
   return o;
 }
 
-checkUnnamed2586(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2573(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2585(o["x"]);
-  checkUnnamed2585(o["y"]);
+  checkUnnamed2572(o["x"]);
+  checkUnnamed2572(o["y"]);
 }
 
-buildUnnamed2587() {
+buildUnnamed2574() {
   var o = new core.List<api.Program>();
   o.add(buildProgram());
   o.add(buildProgram());
   return o;
 }
 
-checkUnnamed2587(core.List<api.Program> o) {
+checkUnnamed2574(core.List<api.Program> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProgram(o[0]);
   checkProgram(o[1]);
@@ -1516,10 +1653,10 @@
     o.description = "foo";
     o.experiment = buildExperiment();
     o.id = "foo";
-    o.info = buildUnnamed2586();
+    o.info = buildUnnamed2573();
     o.name = "foo";
     o.predictedInsertSize = 42;
-    o.programs = buildUnnamed2587();
+    o.programs = buildUnnamed2574();
     o.referenceSetId = "foo";
     o.sampleId = "foo";
   }
@@ -1534,50 +1671,66 @@
     unittest.expect(o.description, unittest.equals('foo'));
     checkExperiment(o.experiment);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2586(o.info);
+    checkUnnamed2573(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.predictedInsertSize, unittest.equals(42));
-    checkUnnamed2587(o.programs);
+    checkUnnamed2574(o.programs);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
   }
   buildCounterReadGroup--;
 }
 
-buildUnnamed2588() {
+buildUnnamed2575() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2588(core.List<core.Object> o) {
+checkUnnamed2575(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted19 = (o[0]) as core.Map; unittest.expect(casted19, unittest.hasLength(3)); unittest.expect(casted19["list"], unittest.equals([1, 2, 3])); unittest.expect(casted19["bool"], unittest.equals(true)); unittest.expect(casted19["string"], unittest.equals('foo')); 
-  var casted20 = (o[1]) as core.Map; unittest.expect(casted20, unittest.hasLength(3)); unittest.expect(casted20["list"], unittest.equals([1, 2, 3])); unittest.expect(casted20["bool"], unittest.equals(true)); unittest.expect(casted20["string"], unittest.equals('foo')); 
+  var casted19 = (o[0]) as core.Map;
+  unittest.expect(casted19, unittest.hasLength(3));
+  unittest.expect(casted19["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted19["bool"], unittest.equals(true));
+  unittest.expect(casted19["string"], unittest.equals('foo'));
+  var casted20 = (o[1]) as core.Map;
+  unittest.expect(casted20, unittest.hasLength(3));
+  unittest.expect(casted20["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted20["bool"], unittest.equals(true));
+  unittest.expect(casted20["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2589() {
+buildUnnamed2576() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2588();
-  o["y"] = buildUnnamed2588();
+  o["x"] = buildUnnamed2575();
+  o["y"] = buildUnnamed2575();
   return o;
 }
 
-checkUnnamed2589(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2576(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2588(o["x"]);
-  checkUnnamed2588(o["y"]);
+  checkUnnamed2575(o["x"]);
+  checkUnnamed2575(o["y"]);
 }
 
-buildUnnamed2590() {
+buildUnnamed2577() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed2590(core.List<api.ReadGroup> o) {
+checkUnnamed2577(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
@@ -1591,9 +1744,9 @@
     o.datasetId = "foo";
     o.filename = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2589();
+    o.info = buildUnnamed2576();
     o.name = "foo";
-    o.readGroups = buildUnnamed2590();
+    o.readGroups = buildUnnamed2577();
     o.referenceSetId = "foo";
   }
   buildCounterReadGroupSet--;
@@ -1606,22 +1759,22 @@
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.filename, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2589(o.info);
+    checkUnnamed2576(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2590(o.readGroups);
+    checkUnnamed2577(o.readGroups);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
   }
   buildCounterReadGroupSet--;
 }
 
-buildUnnamed2591() {
+buildUnnamed2578() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2591(core.List<core.String> o) {
+checkUnnamed2578(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1637,7 +1790,7 @@
     o.md5checksum = "foo";
     o.name = "foo";
     o.ncbiTaxonId = 42;
-    o.sourceAccessions = buildUnnamed2591();
+    o.sourceAccessions = buildUnnamed2578();
     o.sourceUri = "foo";
   }
   buildCounterReference--;
@@ -1652,7 +1805,7 @@
     unittest.expect(o.md5checksum, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ncbiTaxonId, unittest.equals(42));
-    checkUnnamed2591(o.sourceAccessions);
+    checkUnnamed2578(o.sourceAccessions);
     unittest.expect(o.sourceUri, unittest.equals('foo'));
   }
   buildCounterReference--;
@@ -1679,27 +1832,27 @@
   buildCounterReferenceBound--;
 }
 
-buildUnnamed2592() {
+buildUnnamed2579() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2592(core.List<core.String> o) {
+checkUnnamed2579(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2593() {
+buildUnnamed2580() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2593(core.List<core.String> o) {
+checkUnnamed2580(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1715,8 +1868,8 @@
     o.id = "foo";
     o.md5checksum = "foo";
     o.ncbiTaxonId = 42;
-    o.referenceIds = buildUnnamed2592();
-    o.sourceAccessions = buildUnnamed2593();
+    o.referenceIds = buildUnnamed2579();
+    o.sourceAccessions = buildUnnamed2580();
     o.sourceUri = "foo";
   }
   buildCounterReferenceSet--;
@@ -1731,8 +1884,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.md5checksum, unittest.equals('foo'));
     unittest.expect(o.ncbiTaxonId, unittest.equals(42));
-    checkUnnamed2592(o.referenceIds);
-    checkUnnamed2593(o.sourceAccessions);
+    checkUnnamed2579(o.referenceIds);
+    checkUnnamed2580(o.sourceAccessions);
     unittest.expect(o.sourceUri, unittest.equals('foo'));
   }
   buildCounterReferenceSet--;
@@ -1757,6 +1910,421 @@
   buildCounterRuntimeMetadata--;
 }
 
+buildUnnamed2581() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2581(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2582() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2582(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterSearchAnnotationSetsRequest = 0;
+buildSearchAnnotationSetsRequest() {
+  var o = new api.SearchAnnotationSetsRequest();
+  buildCounterSearchAnnotationSetsRequest++;
+  if (buildCounterSearchAnnotationSetsRequest < 3) {
+    o.datasetIds = buildUnnamed2581();
+    o.name = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.referenceSetId = "foo";
+    o.types = buildUnnamed2582();
+  }
+  buildCounterSearchAnnotationSetsRequest--;
+  return o;
+}
+
+checkSearchAnnotationSetsRequest(api.SearchAnnotationSetsRequest o) {
+  buildCounterSearchAnnotationSetsRequest++;
+  if (buildCounterSearchAnnotationSetsRequest < 3) {
+    checkUnnamed2581(o.datasetIds);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    unittest.expect(o.referenceSetId, unittest.equals('foo'));
+    checkUnnamed2582(o.types);
+  }
+  buildCounterSearchAnnotationSetsRequest--;
+}
+
+buildUnnamed2583() {
+  var o = new core.List<api.AnnotationSet>();
+  o.add(buildAnnotationSet());
+  o.add(buildAnnotationSet());
+  return o;
+}
+
+checkUnnamed2583(core.List<api.AnnotationSet> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkAnnotationSet(o[0]);
+  checkAnnotationSet(o[1]);
+}
+
+core.int buildCounterSearchAnnotationSetsResponse = 0;
+buildSearchAnnotationSetsResponse() {
+  var o = new api.SearchAnnotationSetsResponse();
+  buildCounterSearchAnnotationSetsResponse++;
+  if (buildCounterSearchAnnotationSetsResponse < 3) {
+    o.annotationSets = buildUnnamed2583();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchAnnotationSetsResponse--;
+  return o;
+}
+
+checkSearchAnnotationSetsResponse(api.SearchAnnotationSetsResponse o) {
+  buildCounterSearchAnnotationSetsResponse++;
+  if (buildCounterSearchAnnotationSetsResponse < 3) {
+    checkUnnamed2583(o.annotationSets);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchAnnotationSetsResponse--;
+}
+
+buildUnnamed2584() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2584(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterSearchAnnotationsRequest = 0;
+buildSearchAnnotationsRequest() {
+  var o = new api.SearchAnnotationsRequest();
+  buildCounterSearchAnnotationsRequest++;
+  if (buildCounterSearchAnnotationsRequest < 3) {
+    o.annotationSetIds = buildUnnamed2584();
+    o.end = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.referenceId = "foo";
+    o.referenceName = "foo";
+    o.start = "foo";
+  }
+  buildCounterSearchAnnotationsRequest--;
+  return o;
+}
+
+checkSearchAnnotationsRequest(api.SearchAnnotationsRequest o) {
+  buildCounterSearchAnnotationsRequest++;
+  if (buildCounterSearchAnnotationsRequest < 3) {
+    checkUnnamed2584(o.annotationSetIds);
+    unittest.expect(o.end, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    unittest.expect(o.referenceId, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+  }
+  buildCounterSearchAnnotationsRequest--;
+}
+
+buildUnnamed2585() {
+  var o = new core.List<api.Annotation>();
+  o.add(buildAnnotation());
+  o.add(buildAnnotation());
+  return o;
+}
+
+checkUnnamed2585(core.List<api.Annotation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkAnnotation(o[0]);
+  checkAnnotation(o[1]);
+}
+
+core.int buildCounterSearchAnnotationsResponse = 0;
+buildSearchAnnotationsResponse() {
+  var o = new api.SearchAnnotationsResponse();
+  buildCounterSearchAnnotationsResponse++;
+  if (buildCounterSearchAnnotationsResponse < 3) {
+    o.annotations = buildUnnamed2585();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchAnnotationsResponse--;
+  return o;
+}
+
+checkSearchAnnotationsResponse(api.SearchAnnotationsResponse o) {
+  buildCounterSearchAnnotationsResponse++;
+  if (buildCounterSearchAnnotationsResponse < 3) {
+    checkUnnamed2585(o.annotations);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchAnnotationsResponse--;
+}
+
+buildUnnamed2586() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2586(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterSearchCallSetsRequest = 0;
+buildSearchCallSetsRequest() {
+  var o = new api.SearchCallSetsRequest();
+  buildCounterSearchCallSetsRequest++;
+  if (buildCounterSearchCallSetsRequest < 3) {
+    o.name = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.variantSetIds = buildUnnamed2586();
+  }
+  buildCounterSearchCallSetsRequest--;
+  return o;
+}
+
+checkSearchCallSetsRequest(api.SearchCallSetsRequest o) {
+  buildCounterSearchCallSetsRequest++;
+  if (buildCounterSearchCallSetsRequest < 3) {
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    checkUnnamed2586(o.variantSetIds);
+  }
+  buildCounterSearchCallSetsRequest--;
+}
+
+buildUnnamed2587() {
+  var o = new core.List<api.CallSet>();
+  o.add(buildCallSet());
+  o.add(buildCallSet());
+  return o;
+}
+
+checkUnnamed2587(core.List<api.CallSet> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCallSet(o[0]);
+  checkCallSet(o[1]);
+}
+
+core.int buildCounterSearchCallSetsResponse = 0;
+buildSearchCallSetsResponse() {
+  var o = new api.SearchCallSetsResponse();
+  buildCounterSearchCallSetsResponse++;
+  if (buildCounterSearchCallSetsResponse < 3) {
+    o.callSets = buildUnnamed2587();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchCallSetsResponse--;
+  return o;
+}
+
+checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
+  buildCounterSearchCallSetsResponse++;
+  if (buildCounterSearchCallSetsResponse < 3) {
+    checkUnnamed2587(o.callSets);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchCallSetsResponse--;
+}
+
+buildUnnamed2588() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2588(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterSearchReadGroupSetsRequest = 0;
+buildSearchReadGroupSetsRequest() {
+  var o = new api.SearchReadGroupSetsRequest();
+  buildCounterSearchReadGroupSetsRequest++;
+  if (buildCounterSearchReadGroupSetsRequest < 3) {
+    o.datasetIds = buildUnnamed2588();
+    o.name = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+  }
+  buildCounterSearchReadGroupSetsRequest--;
+  return o;
+}
+
+checkSearchReadGroupSetsRequest(api.SearchReadGroupSetsRequest o) {
+  buildCounterSearchReadGroupSetsRequest++;
+  if (buildCounterSearchReadGroupSetsRequest < 3) {
+    checkUnnamed2588(o.datasetIds);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchReadGroupSetsRequest--;
+}
+
+buildUnnamed2589() {
+  var o = new core.List<api.ReadGroupSet>();
+  o.add(buildReadGroupSet());
+  o.add(buildReadGroupSet());
+  return o;
+}
+
+checkUnnamed2589(core.List<api.ReadGroupSet> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReadGroupSet(o[0]);
+  checkReadGroupSet(o[1]);
+}
+
+core.int buildCounterSearchReadGroupSetsResponse = 0;
+buildSearchReadGroupSetsResponse() {
+  var o = new api.SearchReadGroupSetsResponse();
+  buildCounterSearchReadGroupSetsResponse++;
+  if (buildCounterSearchReadGroupSetsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.readGroupSets = buildUnnamed2589();
+  }
+  buildCounterSearchReadGroupSetsResponse--;
+  return o;
+}
+
+checkSearchReadGroupSetsResponse(api.SearchReadGroupSetsResponse o) {
+  buildCounterSearchReadGroupSetsResponse++;
+  if (buildCounterSearchReadGroupSetsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed2589(o.readGroupSets);
+  }
+  buildCounterSearchReadGroupSetsResponse--;
+}
+
+buildUnnamed2590() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2590(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed2591() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2591(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterSearchReadsRequest = 0;
+buildSearchReadsRequest() {
+  var o = new api.SearchReadsRequest();
+  buildCounterSearchReadsRequest++;
+  if (buildCounterSearchReadsRequest < 3) {
+    o.end = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.readGroupIds = buildUnnamed2590();
+    o.readGroupSetIds = buildUnnamed2591();
+    o.referenceName = "foo";
+    o.start = "foo";
+  }
+  buildCounterSearchReadsRequest--;
+  return o;
+}
+
+checkSearchReadsRequest(api.SearchReadsRequest o) {
+  buildCounterSearchReadsRequest++;
+  if (buildCounterSearchReadsRequest < 3) {
+    unittest.expect(o.end, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    checkUnnamed2590(o.readGroupIds);
+    checkUnnamed2591(o.readGroupSetIds);
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+  }
+  buildCounterSearchReadsRequest--;
+}
+
+buildUnnamed2592() {
+  var o = new core.List<api.Read>();
+  o.add(buildRead());
+  o.add(buildRead());
+  return o;
+}
+
+checkUnnamed2592(core.List<api.Read> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRead(o[0]);
+  checkRead(o[1]);
+}
+
+core.int buildCounterSearchReadsResponse = 0;
+buildSearchReadsResponse() {
+  var o = new api.SearchReadsResponse();
+  buildCounterSearchReadsResponse++;
+  if (buildCounterSearchReadsResponse < 3) {
+    o.alignments = buildUnnamed2592();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchReadsResponse--;
+  return o;
+}
+
+checkSearchReadsResponse(api.SearchReadsResponse o) {
+  buildCounterSearchReadsResponse++;
+  if (buildCounterSearchReadsResponse < 3) {
+    checkUnnamed2592(o.alignments);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchReadsResponse--;
+}
+
+buildUnnamed2593() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed2593(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed2594() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1770,82 +2338,80 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterSearchReferenceSetsRequest = 0;
+buildSearchReferenceSetsRequest() {
+  var o = new api.SearchReferenceSetsRequest();
+  buildCounterSearchReferenceSetsRequest++;
+  if (buildCounterSearchReferenceSetsRequest < 3) {
+    o.accessions = buildUnnamed2593();
+    o.assemblyId = "foo";
+    o.md5checksums = buildUnnamed2594();
+    o.pageSize = 42;
+    o.pageToken = "foo";
+  }
+  buildCounterSearchReferenceSetsRequest--;
+  return o;
+}
+
+checkSearchReferenceSetsRequest(api.SearchReferenceSetsRequest o) {
+  buildCounterSearchReferenceSetsRequest++;
+  if (buildCounterSearchReferenceSetsRequest < 3) {
+    checkUnnamed2593(o.accessions);
+    unittest.expect(o.assemblyId, unittest.equals('foo'));
+    checkUnnamed2594(o.md5checksums);
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchReferenceSetsRequest--;
+}
+
 buildUnnamed2595() {
+  var o = new core.List<api.ReferenceSet>();
+  o.add(buildReferenceSet());
+  o.add(buildReferenceSet());
+  return o;
+}
+
+checkUnnamed2595(core.List<api.ReferenceSet> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReferenceSet(o[0]);
+  checkReferenceSet(o[1]);
+}
+
+core.int buildCounterSearchReferenceSetsResponse = 0;
+buildSearchReferenceSetsResponse() {
+  var o = new api.SearchReferenceSetsResponse();
+  buildCounterSearchReferenceSetsResponse++;
+  if (buildCounterSearchReferenceSetsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.referenceSets = buildUnnamed2595();
+  }
+  buildCounterSearchReferenceSetsResponse--;
+  return o;
+}
+
+checkSearchReferenceSetsResponse(api.SearchReferenceSetsResponse o) {
+  buildCounterSearchReferenceSetsResponse++;
+  if (buildCounterSearchReferenceSetsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed2595(o.referenceSets);
+  }
+  buildCounterSearchReferenceSetsResponse--;
+}
+
+buildUnnamed2596() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2595(core.List<core.String> o) {
+checkUnnamed2596(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterSearchAnnotationSetsRequest = 0;
-buildSearchAnnotationSetsRequest() {
-  var o = new api.SearchAnnotationSetsRequest();
-  buildCounterSearchAnnotationSetsRequest++;
-  if (buildCounterSearchAnnotationSetsRequest < 3) {
-    o.datasetIds = buildUnnamed2594();
-    o.name = "foo";
-    o.pageSize = 42;
-    o.pageToken = "foo";
-    o.referenceSetId = "foo";
-    o.types = buildUnnamed2595();
-  }
-  buildCounterSearchAnnotationSetsRequest--;
-  return o;
-}
-
-checkSearchAnnotationSetsRequest(api.SearchAnnotationSetsRequest o) {
-  buildCounterSearchAnnotationSetsRequest++;
-  if (buildCounterSearchAnnotationSetsRequest < 3) {
-    checkUnnamed2594(o.datasetIds);
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-    unittest.expect(o.referenceSetId, unittest.equals('foo'));
-    checkUnnamed2595(o.types);
-  }
-  buildCounterSearchAnnotationSetsRequest--;
-}
-
-buildUnnamed2596() {
-  var o = new core.List<api.AnnotationSet>();
-  o.add(buildAnnotationSet());
-  o.add(buildAnnotationSet());
-  return o;
-}
-
-checkUnnamed2596(core.List<api.AnnotationSet> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkAnnotationSet(o[0]);
-  checkAnnotationSet(o[1]);
-}
-
-core.int buildCounterSearchAnnotationSetsResponse = 0;
-buildSearchAnnotationSetsResponse() {
-  var o = new api.SearchAnnotationSetsResponse();
-  buildCounterSearchAnnotationSetsResponse++;
-  if (buildCounterSearchAnnotationSetsResponse < 3) {
-    o.annotationSets = buildUnnamed2596();
-    o.nextPageToken = "foo";
-  }
-  buildCounterSearchAnnotationSetsResponse--;
-  return o;
-}
-
-checkSearchAnnotationSetsResponse(api.SearchAnnotationSetsResponse o) {
-  buildCounterSearchAnnotationSetsResponse++;
-  if (buildCounterSearchAnnotationSetsResponse < 3) {
-    checkUnnamed2596(o.annotationSets);
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterSearchAnnotationSetsResponse--;
-}
-
 buildUnnamed2597() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1859,69 +2425,65 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterSearchAnnotationsRequest = 0;
-buildSearchAnnotationsRequest() {
-  var o = new api.SearchAnnotationsRequest();
-  buildCounterSearchAnnotationsRequest++;
-  if (buildCounterSearchAnnotationsRequest < 3) {
-    o.annotationSetIds = buildUnnamed2597();
-    o.end = "foo";
+core.int buildCounterSearchReferencesRequest = 0;
+buildSearchReferencesRequest() {
+  var o = new api.SearchReferencesRequest();
+  buildCounterSearchReferencesRequest++;
+  if (buildCounterSearchReferencesRequest < 3) {
+    o.accessions = buildUnnamed2596();
+    o.md5checksums = buildUnnamed2597();
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.referenceId = "foo";
-    o.referenceName = "foo";
-    o.start = "foo";
+    o.referenceSetId = "foo";
   }
-  buildCounterSearchAnnotationsRequest--;
+  buildCounterSearchReferencesRequest--;
   return o;
 }
 
-checkSearchAnnotationsRequest(api.SearchAnnotationsRequest o) {
-  buildCounterSearchAnnotationsRequest++;
-  if (buildCounterSearchAnnotationsRequest < 3) {
-    checkUnnamed2597(o.annotationSetIds);
-    unittest.expect(o.end, unittest.equals('foo'));
+checkSearchReferencesRequest(api.SearchReferencesRequest o) {
+  buildCounterSearchReferencesRequest++;
+  if (buildCounterSearchReferencesRequest < 3) {
+    checkUnnamed2596(o.accessions);
+    checkUnnamed2597(o.md5checksums);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    unittest.expect(o.referenceId, unittest.equals('foo'));
-    unittest.expect(o.referenceName, unittest.equals('foo'));
-    unittest.expect(o.start, unittest.equals('foo'));
+    unittest.expect(o.referenceSetId, unittest.equals('foo'));
   }
-  buildCounterSearchAnnotationsRequest--;
+  buildCounterSearchReferencesRequest--;
 }
 
 buildUnnamed2598() {
-  var o = new core.List<api.Annotation>();
-  o.add(buildAnnotation());
-  o.add(buildAnnotation());
+  var o = new core.List<api.Reference>();
+  o.add(buildReference());
+  o.add(buildReference());
   return o;
 }
 
-checkUnnamed2598(core.List<api.Annotation> o) {
+checkUnnamed2598(core.List<api.Reference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotation(o[0]);
-  checkAnnotation(o[1]);
+  checkReference(o[0]);
+  checkReference(o[1]);
 }
 
-core.int buildCounterSearchAnnotationsResponse = 0;
-buildSearchAnnotationsResponse() {
-  var o = new api.SearchAnnotationsResponse();
-  buildCounterSearchAnnotationsResponse++;
-  if (buildCounterSearchAnnotationsResponse < 3) {
-    o.annotations = buildUnnamed2598();
+core.int buildCounterSearchReferencesResponse = 0;
+buildSearchReferencesResponse() {
+  var o = new api.SearchReferencesResponse();
+  buildCounterSearchReferencesResponse++;
+  if (buildCounterSearchReferencesResponse < 3) {
     o.nextPageToken = "foo";
+    o.references = buildUnnamed2598();
   }
-  buildCounterSearchAnnotationsResponse--;
+  buildCounterSearchReferencesResponse--;
   return o;
 }
 
-checkSearchAnnotationsResponse(api.SearchAnnotationsResponse o) {
-  buildCounterSearchAnnotationsResponse++;
-  if (buildCounterSearchAnnotationsResponse < 3) {
-    checkUnnamed2598(o.annotations);
+checkSearchReferencesResponse(api.SearchReferencesResponse o) {
+  buildCounterSearchReferencesResponse++;
+  if (buildCounterSearchReferencesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed2598(o.references);
   }
-  buildCounterSearchAnnotationsResponse--;
+  buildCounterSearchReferencesResponse--;
 }
 
 buildUnnamed2599() {
@@ -1937,63 +2499,61 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterSearchCallSetsRequest = 0;
-buildSearchCallSetsRequest() {
-  var o = new api.SearchCallSetsRequest();
-  buildCounterSearchCallSetsRequest++;
-  if (buildCounterSearchCallSetsRequest < 3) {
-    o.name = "foo";
+core.int buildCounterSearchVariantSetsRequest = 0;
+buildSearchVariantSetsRequest() {
+  var o = new api.SearchVariantSetsRequest();
+  buildCounterSearchVariantSetsRequest++;
+  if (buildCounterSearchVariantSetsRequest < 3) {
+    o.datasetIds = buildUnnamed2599();
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantSetIds = buildUnnamed2599();
   }
-  buildCounterSearchCallSetsRequest--;
+  buildCounterSearchVariantSetsRequest--;
   return o;
 }
 
-checkSearchCallSetsRequest(api.SearchCallSetsRequest o) {
-  buildCounterSearchCallSetsRequest++;
-  if (buildCounterSearchCallSetsRequest < 3) {
-    unittest.expect(o.name, unittest.equals('foo'));
+checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
+  buildCounterSearchVariantSetsRequest++;
+  if (buildCounterSearchVariantSetsRequest < 3) {
+    checkUnnamed2599(o.datasetIds);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed2599(o.variantSetIds);
   }
-  buildCounterSearchCallSetsRequest--;
+  buildCounterSearchVariantSetsRequest--;
 }
 
 buildUnnamed2600() {
-  var o = new core.List<api.CallSet>();
-  o.add(buildCallSet());
-  o.add(buildCallSet());
+  var o = new core.List<api.VariantSet>();
+  o.add(buildVariantSet());
+  o.add(buildVariantSet());
   return o;
 }
 
-checkUnnamed2600(core.List<api.CallSet> o) {
+checkUnnamed2600(core.List<api.VariantSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCallSet(o[0]);
-  checkCallSet(o[1]);
+  checkVariantSet(o[0]);
+  checkVariantSet(o[1]);
 }
 
-core.int buildCounterSearchCallSetsResponse = 0;
-buildSearchCallSetsResponse() {
-  var o = new api.SearchCallSetsResponse();
-  buildCounterSearchCallSetsResponse++;
-  if (buildCounterSearchCallSetsResponse < 3) {
-    o.callSets = buildUnnamed2600();
+core.int buildCounterSearchVariantSetsResponse = 0;
+buildSearchVariantSetsResponse() {
+  var o = new api.SearchVariantSetsResponse();
+  buildCounterSearchVariantSetsResponse++;
+  if (buildCounterSearchVariantSetsResponse < 3) {
     o.nextPageToken = "foo";
+    o.variantSets = buildUnnamed2600();
   }
-  buildCounterSearchCallSetsResponse--;
+  buildCounterSearchVariantSetsResponse--;
   return o;
 }
 
-checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
-  buildCounterSearchCallSetsResponse++;
-  if (buildCounterSearchCallSetsResponse < 3) {
-    checkUnnamed2600(o.callSets);
+checkSearchVariantSetsResponse(api.SearchVariantSetsResponse o) {
+  buildCounterSearchVariantSetsResponse++;
+  if (buildCounterSearchVariantSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed2600(o.variantSets);
   }
-  buildCounterSearchCallSetsResponse--;
+  buildCounterSearchVariantSetsResponse--;
 }
 
 buildUnnamed2601() {
@@ -2009,421 +2569,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterSearchReadGroupSetsRequest = 0;
-buildSearchReadGroupSetsRequest() {
-  var o = new api.SearchReadGroupSetsRequest();
-  buildCounterSearchReadGroupSetsRequest++;
-  if (buildCounterSearchReadGroupSetsRequest < 3) {
-    o.datasetIds = buildUnnamed2601();
-    o.name = "foo";
-    o.pageSize = 42;
-    o.pageToken = "foo";
-  }
-  buildCounterSearchReadGroupSetsRequest--;
-  return o;
-}
-
-checkSearchReadGroupSetsRequest(api.SearchReadGroupSetsRequest o) {
-  buildCounterSearchReadGroupSetsRequest++;
-  if (buildCounterSearchReadGroupSetsRequest < 3) {
-    checkUnnamed2601(o.datasetIds);
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-  }
-  buildCounterSearchReadGroupSetsRequest--;
-}
-
 buildUnnamed2602() {
-  var o = new core.List<api.ReadGroupSet>();
-  o.add(buildReadGroupSet());
-  o.add(buildReadGroupSet());
-  return o;
-}
-
-checkUnnamed2602(core.List<api.ReadGroupSet> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkReadGroupSet(o[0]);
-  checkReadGroupSet(o[1]);
-}
-
-core.int buildCounterSearchReadGroupSetsResponse = 0;
-buildSearchReadGroupSetsResponse() {
-  var o = new api.SearchReadGroupSetsResponse();
-  buildCounterSearchReadGroupSetsResponse++;
-  if (buildCounterSearchReadGroupSetsResponse < 3) {
-    o.nextPageToken = "foo";
-    o.readGroupSets = buildUnnamed2602();
-  }
-  buildCounterSearchReadGroupSetsResponse--;
-  return o;
-}
-
-checkSearchReadGroupSetsResponse(api.SearchReadGroupSetsResponse o) {
-  buildCounterSearchReadGroupSetsResponse++;
-  if (buildCounterSearchReadGroupSetsResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2602(o.readGroupSets);
-  }
-  buildCounterSearchReadGroupSetsResponse--;
-}
-
-buildUnnamed2603() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2603(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2604() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2604(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterSearchReadsRequest = 0;
-buildSearchReadsRequest() {
-  var o = new api.SearchReadsRequest();
-  buildCounterSearchReadsRequest++;
-  if (buildCounterSearchReadsRequest < 3) {
-    o.end = "foo";
-    o.pageSize = 42;
-    o.pageToken = "foo";
-    o.readGroupIds = buildUnnamed2603();
-    o.readGroupSetIds = buildUnnamed2604();
-    o.referenceName = "foo";
-    o.start = "foo";
-  }
-  buildCounterSearchReadsRequest--;
-  return o;
-}
-
-checkSearchReadsRequest(api.SearchReadsRequest o) {
-  buildCounterSearchReadsRequest++;
-  if (buildCounterSearchReadsRequest < 3) {
-    unittest.expect(o.end, unittest.equals('foo'));
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed2603(o.readGroupIds);
-    checkUnnamed2604(o.readGroupSetIds);
-    unittest.expect(o.referenceName, unittest.equals('foo'));
-    unittest.expect(o.start, unittest.equals('foo'));
-  }
-  buildCounterSearchReadsRequest--;
-}
-
-buildUnnamed2605() {
-  var o = new core.List<api.Read>();
-  o.add(buildRead());
-  o.add(buildRead());
-  return o;
-}
-
-checkUnnamed2605(core.List<api.Read> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkRead(o[0]);
-  checkRead(o[1]);
-}
-
-core.int buildCounterSearchReadsResponse = 0;
-buildSearchReadsResponse() {
-  var o = new api.SearchReadsResponse();
-  buildCounterSearchReadsResponse++;
-  if (buildCounterSearchReadsResponse < 3) {
-    o.alignments = buildUnnamed2605();
-    o.nextPageToken = "foo";
-  }
-  buildCounterSearchReadsResponse--;
-  return o;
-}
-
-checkSearchReadsResponse(api.SearchReadsResponse o) {
-  buildCounterSearchReadsResponse++;
-  if (buildCounterSearchReadsResponse < 3) {
-    checkUnnamed2605(o.alignments);
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterSearchReadsResponse--;
-}
-
-buildUnnamed2606() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2606(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2607() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2607(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterSearchReferenceSetsRequest = 0;
-buildSearchReferenceSetsRequest() {
-  var o = new api.SearchReferenceSetsRequest();
-  buildCounterSearchReferenceSetsRequest++;
-  if (buildCounterSearchReferenceSetsRequest < 3) {
-    o.accessions = buildUnnamed2606();
-    o.assemblyId = "foo";
-    o.md5checksums = buildUnnamed2607();
-    o.pageSize = 42;
-    o.pageToken = "foo";
-  }
-  buildCounterSearchReferenceSetsRequest--;
-  return o;
-}
-
-checkSearchReferenceSetsRequest(api.SearchReferenceSetsRequest o) {
-  buildCounterSearchReferenceSetsRequest++;
-  if (buildCounterSearchReferenceSetsRequest < 3) {
-    checkUnnamed2606(o.accessions);
-    unittest.expect(o.assemblyId, unittest.equals('foo'));
-    checkUnnamed2607(o.md5checksums);
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-  }
-  buildCounterSearchReferenceSetsRequest--;
-}
-
-buildUnnamed2608() {
-  var o = new core.List<api.ReferenceSet>();
-  o.add(buildReferenceSet());
-  o.add(buildReferenceSet());
-  return o;
-}
-
-checkUnnamed2608(core.List<api.ReferenceSet> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkReferenceSet(o[0]);
-  checkReferenceSet(o[1]);
-}
-
-core.int buildCounterSearchReferenceSetsResponse = 0;
-buildSearchReferenceSetsResponse() {
-  var o = new api.SearchReferenceSetsResponse();
-  buildCounterSearchReferenceSetsResponse++;
-  if (buildCounterSearchReferenceSetsResponse < 3) {
-    o.nextPageToken = "foo";
-    o.referenceSets = buildUnnamed2608();
-  }
-  buildCounterSearchReferenceSetsResponse--;
-  return o;
-}
-
-checkSearchReferenceSetsResponse(api.SearchReferenceSetsResponse o) {
-  buildCounterSearchReferenceSetsResponse++;
-  if (buildCounterSearchReferenceSetsResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2608(o.referenceSets);
-  }
-  buildCounterSearchReferenceSetsResponse--;
-}
-
-buildUnnamed2609() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2609(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2610() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2610(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterSearchReferencesRequest = 0;
-buildSearchReferencesRequest() {
-  var o = new api.SearchReferencesRequest();
-  buildCounterSearchReferencesRequest++;
-  if (buildCounterSearchReferencesRequest < 3) {
-    o.accessions = buildUnnamed2609();
-    o.md5checksums = buildUnnamed2610();
-    o.pageSize = 42;
-    o.pageToken = "foo";
-    o.referenceSetId = "foo";
-  }
-  buildCounterSearchReferencesRequest--;
-  return o;
-}
-
-checkSearchReferencesRequest(api.SearchReferencesRequest o) {
-  buildCounterSearchReferencesRequest++;
-  if (buildCounterSearchReferencesRequest < 3) {
-    checkUnnamed2609(o.accessions);
-    checkUnnamed2610(o.md5checksums);
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-    unittest.expect(o.referenceSetId, unittest.equals('foo'));
-  }
-  buildCounterSearchReferencesRequest--;
-}
-
-buildUnnamed2611() {
-  var o = new core.List<api.Reference>();
-  o.add(buildReference());
-  o.add(buildReference());
-  return o;
-}
-
-checkUnnamed2611(core.List<api.Reference> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkReference(o[0]);
-  checkReference(o[1]);
-}
-
-core.int buildCounterSearchReferencesResponse = 0;
-buildSearchReferencesResponse() {
-  var o = new api.SearchReferencesResponse();
-  buildCounterSearchReferencesResponse++;
-  if (buildCounterSearchReferencesResponse < 3) {
-    o.nextPageToken = "foo";
-    o.references = buildUnnamed2611();
-  }
-  buildCounterSearchReferencesResponse--;
-  return o;
-}
-
-checkSearchReferencesResponse(api.SearchReferencesResponse o) {
-  buildCounterSearchReferencesResponse++;
-  if (buildCounterSearchReferencesResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2611(o.references);
-  }
-  buildCounterSearchReferencesResponse--;
-}
-
-buildUnnamed2612() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2612(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterSearchVariantSetsRequest = 0;
-buildSearchVariantSetsRequest() {
-  var o = new api.SearchVariantSetsRequest();
-  buildCounterSearchVariantSetsRequest++;
-  if (buildCounterSearchVariantSetsRequest < 3) {
-    o.datasetIds = buildUnnamed2612();
-    o.pageSize = 42;
-    o.pageToken = "foo";
-  }
-  buildCounterSearchVariantSetsRequest--;
-  return o;
-}
-
-checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
-  buildCounterSearchVariantSetsRequest++;
-  if (buildCounterSearchVariantSetsRequest < 3) {
-    checkUnnamed2612(o.datasetIds);
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-  }
-  buildCounterSearchVariantSetsRequest--;
-}
-
-buildUnnamed2613() {
-  var o = new core.List<api.VariantSet>();
-  o.add(buildVariantSet());
-  o.add(buildVariantSet());
-  return o;
-}
-
-checkUnnamed2613(core.List<api.VariantSet> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkVariantSet(o[0]);
-  checkVariantSet(o[1]);
-}
-
-core.int buildCounterSearchVariantSetsResponse = 0;
-buildSearchVariantSetsResponse() {
-  var o = new api.SearchVariantSetsResponse();
-  buildCounterSearchVariantSetsResponse++;
-  if (buildCounterSearchVariantSetsResponse < 3) {
-    o.nextPageToken = "foo";
-    o.variantSets = buildUnnamed2613();
-  }
-  buildCounterSearchVariantSetsResponse--;
-  return o;
-}
-
-checkSearchVariantSetsResponse(api.SearchVariantSetsResponse o) {
-  buildCounterSearchVariantSetsResponse++;
-  if (buildCounterSearchVariantSetsResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2613(o.variantSets);
-  }
-  buildCounterSearchVariantSetsResponse--;
-}
-
-buildUnnamed2614() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2614(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2615() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2615(core.List<core.String> o) {
+checkUnnamed2602(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2434,7 +2587,7 @@
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callSetIds = buildUnnamed2614();
+    o.callSetIds = buildUnnamed2601();
     o.end = "foo";
     o.maxCalls = 42;
     o.pageSize = 42;
@@ -2442,7 +2595,7 @@
     o.referenceName = "foo";
     o.start = "foo";
     o.variantName = "foo";
-    o.variantSetIds = buildUnnamed2615();
+    o.variantSetIds = buildUnnamed2602();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -2451,7 +2604,7 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed2614(o.callSetIds);
+    checkUnnamed2601(o.callSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.maxCalls, unittest.equals(42));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -2459,19 +2612,19 @@
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    checkUnnamed2615(o.variantSetIds);
+    checkUnnamed2602(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed2616() {
+buildUnnamed2603() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed2616(core.List<api.Variant> o) {
+checkUnnamed2603(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -2483,7 +2636,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed2616();
+    o.variants = buildUnnamed2603();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -2493,7 +2646,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2616(o.variants);
+    checkUnnamed2603(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
@@ -2517,30 +2670,46 @@
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed2617() {
+buildUnnamed2604() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2617(core.Map<core.String, core.Object> o) {
+checkUnnamed2604(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted21 = (o["x"]) as core.Map; unittest.expect(casted21, unittest.hasLength(3)); unittest.expect(casted21["list"], unittest.equals([1, 2, 3])); unittest.expect(casted21["bool"], unittest.equals(true)); unittest.expect(casted21["string"], unittest.equals('foo')); 
-  var casted22 = (o["y"]) as core.Map; unittest.expect(casted22, unittest.hasLength(3)); unittest.expect(casted22["list"], unittest.equals([1, 2, 3])); unittest.expect(casted22["bool"], unittest.equals(true)); unittest.expect(casted22["string"], unittest.equals('foo')); 
+  var casted21 = (o["x"]) as core.Map;
+  unittest.expect(casted21, unittest.hasLength(3));
+  unittest.expect(casted21["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted21["bool"], unittest.equals(true));
+  unittest.expect(casted21["string"], unittest.equals('foo'));
+  var casted22 = (o["y"]) as core.Map;
+  unittest.expect(casted22, unittest.hasLength(3));
+  unittest.expect(casted22["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted22["bool"], unittest.equals(true));
+  unittest.expect(casted22["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2618() {
+buildUnnamed2605() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2617());
-  o.add(buildUnnamed2617());
+  o.add(buildUnnamed2604());
+  o.add(buildUnnamed2604());
   return o;
 }
 
-checkUnnamed2618(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2605(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2617(o[0]);
-  checkUnnamed2617(o[1]);
+  checkUnnamed2604(o[0]);
+  checkUnnamed2604(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -2549,7 +2718,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2618();
+    o.details = buildUnnamed2605();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -2560,20 +2729,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2618(o.details);
+    checkUnnamed2605(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed2619() {
+buildUnnamed2606() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2619(core.List<core.String> o) {
+checkUnnamed2606(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2584,7 +2753,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed2619();
+    o.permissions = buildUnnamed2606();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -2593,19 +2762,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed2619(o.permissions);
+    checkUnnamed2606(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed2620() {
+buildUnnamed2607() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2620(core.List<core.String> o) {
+checkUnnamed2607(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2616,7 +2785,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed2620();
+    o.permissions = buildUnnamed2607();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -2625,19 +2794,19 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed2620(o.permissions);
+    checkUnnamed2607(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
 
-buildUnnamed2621() {
+buildUnnamed2608() {
   var o = new core.List<api.Exon>();
   o.add(buildExon());
   o.add(buildExon());
   return o;
 }
 
-checkUnnamed2621(core.List<api.Exon> o) {
+checkUnnamed2608(core.List<api.Exon> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExon(o[0]);
   checkExon(o[1]);
@@ -2649,7 +2818,7 @@
   buildCounterTranscript++;
   if (buildCounterTranscript < 3) {
     o.codingSequence = buildCodingSequence();
-    o.exons = buildUnnamed2621();
+    o.exons = buildUnnamed2608();
     o.geneId = "foo";
   }
   buildCounterTranscript--;
@@ -2660,7 +2829,7 @@
   buildCounterTranscript++;
   if (buildCounterTranscript < 3) {
     checkCodingSequence(o.codingSequence);
-    checkUnnamed2621(o.exons);
+    checkUnnamed2608(o.exons);
     unittest.expect(o.geneId, unittest.equals('foo'));
   }
   buildCounterTranscript--;
@@ -2670,92 +2839,106 @@
 buildUndeleteDatasetRequest() {
   var o = new api.UndeleteDatasetRequest();
   buildCounterUndeleteDatasetRequest++;
-  if (buildCounterUndeleteDatasetRequest < 3) {
-  }
+  if (buildCounterUndeleteDatasetRequest < 3) {}
   buildCounterUndeleteDatasetRequest--;
   return o;
 }
 
 checkUndeleteDatasetRequest(api.UndeleteDatasetRequest o) {
   buildCounterUndeleteDatasetRequest++;
-  if (buildCounterUndeleteDatasetRequest < 3) {
-  }
+  if (buildCounterUndeleteDatasetRequest < 3) {}
   buildCounterUndeleteDatasetRequest--;
 }
 
-buildUnnamed2622() {
+buildUnnamed2609() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2622(core.List<core.String> o) {
+checkUnnamed2609(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2623() {
+buildUnnamed2610() {
   var o = new core.List<api.VariantCall>();
   o.add(buildVariantCall());
   o.add(buildVariantCall());
   return o;
 }
 
-checkUnnamed2623(core.List<api.VariantCall> o) {
+checkUnnamed2610(core.List<api.VariantCall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantCall(o[0]);
   checkVariantCall(o[1]);
 }
 
-buildUnnamed2624() {
+buildUnnamed2611() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2624(core.List<core.String> o) {
+checkUnnamed2611(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2625() {
+buildUnnamed2612() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2625(core.List<core.Object> o) {
+checkUnnamed2612(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted23 = (o[0]) as core.Map; unittest.expect(casted23, unittest.hasLength(3)); unittest.expect(casted23["list"], unittest.equals([1, 2, 3])); unittest.expect(casted23["bool"], unittest.equals(true)); unittest.expect(casted23["string"], unittest.equals('foo')); 
-  var casted24 = (o[1]) as core.Map; unittest.expect(casted24, unittest.hasLength(3)); unittest.expect(casted24["list"], unittest.equals([1, 2, 3])); unittest.expect(casted24["bool"], unittest.equals(true)); unittest.expect(casted24["string"], unittest.equals('foo')); 
+  var casted23 = (o[0]) as core.Map;
+  unittest.expect(casted23, unittest.hasLength(3));
+  unittest.expect(casted23["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted23["bool"], unittest.equals(true));
+  unittest.expect(casted23["string"], unittest.equals('foo'));
+  var casted24 = (o[1]) as core.Map;
+  unittest.expect(casted24, unittest.hasLength(3));
+  unittest.expect(casted24["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted24["bool"], unittest.equals(true));
+  unittest.expect(casted24["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2626() {
+buildUnnamed2613() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2625();
-  o["y"] = buildUnnamed2625();
+  o["x"] = buildUnnamed2612();
+  o["y"] = buildUnnamed2612();
   return o;
 }
 
-checkUnnamed2626(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2613(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2625(o["x"]);
-  checkUnnamed2625(o["y"]);
+  checkUnnamed2612(o["x"]);
+  checkUnnamed2612(o["y"]);
 }
 
-buildUnnamed2627() {
+buildUnnamed2614() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2627(core.List<core.String> o) {
+checkUnnamed2614(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2766,14 +2949,14 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed2622();
-    o.calls = buildUnnamed2623();
+    o.alternateBases = buildUnnamed2609();
+    o.calls = buildUnnamed2610();
     o.created = "foo";
     o.end = "foo";
-    o.filter = buildUnnamed2624();
+    o.filter = buildUnnamed2611();
     o.id = "foo";
-    o.info = buildUnnamed2626();
-    o.names = buildUnnamed2627();
+    o.info = buildUnnamed2613();
+    o.names = buildUnnamed2614();
     o.quality = 42.0;
     o.referenceBases = "foo";
     o.referenceName = "foo";
@@ -2787,14 +2970,14 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed2622(o.alternateBases);
-    checkUnnamed2623(o.calls);
+    checkUnnamed2609(o.alternateBases);
+    checkUnnamed2610(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
-    checkUnnamed2624(o.filter);
+    checkUnnamed2611(o.filter);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2626(o.info);
-    checkUnnamed2627(o.names);
+    checkUnnamed2613(o.info);
+    checkUnnamed2614(o.names);
     unittest.expect(o.quality, unittest.equals(42.0));
     unittest.expect(o.referenceBases, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -2804,27 +2987,27 @@
   buildCounterVariant--;
 }
 
-buildUnnamed2628() {
+buildUnnamed2615() {
   var o = new core.List<api.ClinicalCondition>();
   o.add(buildClinicalCondition());
   o.add(buildClinicalCondition());
   return o;
 }
 
-checkUnnamed2628(core.List<api.ClinicalCondition> o) {
+checkUnnamed2615(core.List<api.ClinicalCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkClinicalCondition(o[0]);
   checkClinicalCondition(o[1]);
 }
 
-buildUnnamed2629() {
+buildUnnamed2616() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2629(core.List<core.String> o) {
+checkUnnamed2616(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2837,10 +3020,10 @@
   if (buildCounterVariantAnnotation < 3) {
     o.alternateBases = "foo";
     o.clinicalSignificance = "foo";
-    o.conditions = buildUnnamed2628();
+    o.conditions = buildUnnamed2615();
     o.effect = "foo";
     o.geneId = "foo";
-    o.transcriptIds = buildUnnamed2629();
+    o.transcriptIds = buildUnnamed2616();
     o.type = "foo";
   }
   buildCounterVariantAnnotation--;
@@ -2852,65 +3035,81 @@
   if (buildCounterVariantAnnotation < 3) {
     unittest.expect(o.alternateBases, unittest.equals('foo'));
     unittest.expect(o.clinicalSignificance, unittest.equals('foo'));
-    checkUnnamed2628(o.conditions);
+    checkUnnamed2615(o.conditions);
     unittest.expect(o.effect, unittest.equals('foo'));
     unittest.expect(o.geneId, unittest.equals('foo'));
-    checkUnnamed2629(o.transcriptIds);
+    checkUnnamed2616(o.transcriptIds);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterVariantAnnotation--;
 }
 
-buildUnnamed2630() {
+buildUnnamed2617() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed2630(core.List<core.int> o) {
+checkUnnamed2617(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed2631() {
+buildUnnamed2618() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed2631(core.List<core.double> o) {
+checkUnnamed2618(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed2632() {
+buildUnnamed2619() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2632(core.List<core.Object> o) {
+checkUnnamed2619(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted25 = (o[0]) as core.Map; unittest.expect(casted25, unittest.hasLength(3)); unittest.expect(casted25["list"], unittest.equals([1, 2, 3])); unittest.expect(casted25["bool"], unittest.equals(true)); unittest.expect(casted25["string"], unittest.equals('foo')); 
-  var casted26 = (o[1]) as core.Map; unittest.expect(casted26, unittest.hasLength(3)); unittest.expect(casted26["list"], unittest.equals([1, 2, 3])); unittest.expect(casted26["bool"], unittest.equals(true)); unittest.expect(casted26["string"], unittest.equals('foo')); 
+  var casted25 = (o[0]) as core.Map;
+  unittest.expect(casted25, unittest.hasLength(3));
+  unittest.expect(casted25["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted25["bool"], unittest.equals(true));
+  unittest.expect(casted25["string"], unittest.equals('foo'));
+  var casted26 = (o[1]) as core.Map;
+  unittest.expect(casted26, unittest.hasLength(3));
+  unittest.expect(casted26["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted26["bool"], unittest.equals(true));
+  unittest.expect(casted26["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2633() {
+buildUnnamed2620() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2632();
-  o["y"] = buildUnnamed2632();
+  o["x"] = buildUnnamed2619();
+  o["y"] = buildUnnamed2619();
   return o;
 }
 
-checkUnnamed2633(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2620(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2632(o["x"]);
-  checkUnnamed2632(o["y"]);
+  checkUnnamed2619(o["x"]);
+  checkUnnamed2619(o["y"]);
 }
 
 core.int buildCounterVariantCall = 0;
@@ -2920,9 +3119,9 @@
   if (buildCounterVariantCall < 3) {
     o.callSetId = "foo";
     o.callSetName = "foo";
-    o.genotype = buildUnnamed2630();
-    o.genotypeLikelihood = buildUnnamed2631();
-    o.info = buildUnnamed2633();
+    o.genotype = buildUnnamed2617();
+    o.genotypeLikelihood = buildUnnamed2618();
+    o.info = buildUnnamed2620();
     o.phaseset = "foo";
   }
   buildCounterVariantCall--;
@@ -2934,35 +3133,35 @@
   if (buildCounterVariantCall < 3) {
     unittest.expect(o.callSetId, unittest.equals('foo'));
     unittest.expect(o.callSetName, unittest.equals('foo'));
-    checkUnnamed2630(o.genotype);
-    checkUnnamed2631(o.genotypeLikelihood);
-    checkUnnamed2633(o.info);
+    checkUnnamed2617(o.genotype);
+    checkUnnamed2618(o.genotypeLikelihood);
+    checkUnnamed2620(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterVariantCall--;
 }
 
-buildUnnamed2634() {
+buildUnnamed2621() {
   var o = new core.List<api.VariantSetMetadata>();
   o.add(buildVariantSetMetadata());
   o.add(buildVariantSetMetadata());
   return o;
 }
 
-checkUnnamed2634(core.List<api.VariantSetMetadata> o) {
+checkUnnamed2621(core.List<api.VariantSetMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSetMetadata(o[0]);
   checkVariantSetMetadata(o[1]);
 }
 
-buildUnnamed2635() {
+buildUnnamed2622() {
   var o = new core.List<api.ReferenceBound>();
   o.add(buildReferenceBound());
   o.add(buildReferenceBound());
   return o;
 }
 
-checkUnnamed2635(core.List<api.ReferenceBound> o) {
+checkUnnamed2622(core.List<api.ReferenceBound> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceBound(o[0]);
   checkReferenceBound(o[1]);
@@ -2976,9 +3175,9 @@
     o.datasetId = "foo";
     o.description = "foo";
     o.id = "foo";
-    o.metadata = buildUnnamed2634();
+    o.metadata = buildUnnamed2621();
     o.name = "foo";
-    o.referenceBounds = buildUnnamed2635();
+    o.referenceBounds = buildUnnamed2622();
     o.referenceSetId = "foo";
   }
   buildCounterVariantSet--;
@@ -2991,38 +3190,54 @@
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2634(o.metadata);
+    checkUnnamed2621(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2635(o.referenceBounds);
+    checkUnnamed2622(o.referenceBounds);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
   }
   buildCounterVariantSet--;
 }
 
-buildUnnamed2636() {
+buildUnnamed2623() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2636(core.List<core.Object> o) {
+checkUnnamed2623(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted27 = (o[0]) as core.Map; unittest.expect(casted27, unittest.hasLength(3)); unittest.expect(casted27["list"], unittest.equals([1, 2, 3])); unittest.expect(casted27["bool"], unittest.equals(true)); unittest.expect(casted27["string"], unittest.equals('foo')); 
-  var casted28 = (o[1]) as core.Map; unittest.expect(casted28, unittest.hasLength(3)); unittest.expect(casted28["list"], unittest.equals([1, 2, 3])); unittest.expect(casted28["bool"], unittest.equals(true)); unittest.expect(casted28["string"], unittest.equals('foo')); 
+  var casted27 = (o[0]) as core.Map;
+  unittest.expect(casted27, unittest.hasLength(3));
+  unittest.expect(casted27["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted27["bool"], unittest.equals(true));
+  unittest.expect(casted27["string"], unittest.equals('foo'));
+  var casted28 = (o[1]) as core.Map;
+  unittest.expect(casted28, unittest.hasLength(3));
+  unittest.expect(casted28["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted28["bool"], unittest.equals(true));
+  unittest.expect(casted28["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2637() {
+buildUnnamed2624() {
   var o = new core.Map<core.String, core.List<core.Object>>();
-  o["x"] = buildUnnamed2636();
-  o["y"] = buildUnnamed2636();
+  o["x"] = buildUnnamed2623();
+  o["y"] = buildUnnamed2623();
   return o;
 }
 
-checkUnnamed2637(core.Map<core.String, core.List<core.Object>> o) {
+checkUnnamed2624(core.Map<core.String, core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2636(o["x"]);
-  checkUnnamed2636(o["y"]);
+  checkUnnamed2623(o["x"]);
+  checkUnnamed2623(o["y"]);
 }
 
 core.int buildCounterVariantSetMetadata = 0;
@@ -3032,7 +3247,7 @@
   if (buildCounterVariantSetMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed2637();
+    o.info = buildUnnamed2624();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -3047,7 +3262,7 @@
   if (buildCounterVariantSetMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed2637(o.info);
+    checkUnnamed2624(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -3056,7 +3271,6 @@
   buildCounterVariantSetMetadata--;
 }
 
-
 main() {
   unittest.group("obj-schema-Annotation", () {
     unittest.test("to-json--from-json", () {
@@ -3066,7 +3280,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnnotationSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnnotationSet();
@@ -3075,7 +3288,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchCreateAnnotationsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchCreateAnnotationsRequest();
@@ -3084,7 +3296,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchCreateAnnotationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchCreateAnnotationsResponse();
@@ -3093,7 +3304,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -3102,7 +3312,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CallSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildCallSet();
@@ -3111,7 +3320,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CancelOperationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCancelOperationRequest();
@@ -3120,7 +3328,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CigarUnit", () {
     unittest.test("to-json--from-json", () {
       var o = buildCigarUnit();
@@ -3129,7 +3336,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClinicalCondition", () {
     unittest.test("to-json--from-json", () {
       var o = buildClinicalCondition();
@@ -3138,7 +3344,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CodingSequence", () {
     unittest.test("to-json--from-json", () {
       var o = buildCodingSequence();
@@ -3147,7 +3352,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ComputeEngine", () {
     unittest.test("to-json--from-json", () {
       var o = buildComputeEngine();
@@ -3156,7 +3360,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CoverageBucket", () {
     unittest.test("to-json--from-json", () {
       var o = buildCoverageBucket();
@@ -3165,7 +3368,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Dataset", () {
     unittest.test("to-json--from-json", () {
       var o = buildDataset();
@@ -3174,7 +3376,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -3183,7 +3384,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Entry", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntry();
@@ -3192,7 +3392,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Exon", () {
     unittest.test("to-json--from-json", () {
       var o = buildExon();
@@ -3201,7 +3400,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Experiment", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperiment();
@@ -3210,7 +3408,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExportReadGroupSetRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildExportReadGroupSetRequest();
@@ -3219,7 +3416,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExportVariantSetRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildExportVariantSetRequest();
@@ -3228,7 +3424,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExternalId", () {
     unittest.test("to-json--from-json", () {
       var o = buildExternalId();
@@ -3237,7 +3432,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetIamPolicyRequest();
@@ -3246,7 +3440,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImportReadGroupSetsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildImportReadGroupSetsRequest();
@@ -3255,7 +3448,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImportReadGroupSetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildImportReadGroupSetsResponse();
@@ -3264,7 +3456,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImportVariantsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildImportVariantsRequest();
@@ -3273,7 +3464,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImportVariantsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildImportVariantsResponse();
@@ -3282,7 +3472,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LinearAlignment", () {
     unittest.test("to-json--from-json", () {
       var o = buildLinearAlignment();
@@ -3291,7 +3480,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListBasesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListBasesResponse();
@@ -3300,7 +3488,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListCoverageBucketsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListCoverageBucketsResponse();
@@ -3309,7 +3496,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListDatasetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListDatasetsResponse();
@@ -3318,7 +3504,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -3327,7 +3512,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MergeVariantsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildMergeVariantsRequest();
@@ -3336,7 +3520,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -3345,7 +3528,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationEvent();
@@ -3354,7 +3536,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadata();
@@ -3363,7 +3544,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -3372,7 +3552,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Position", () {
     unittest.test("to-json--from-json", () {
       var o = buildPosition();
@@ -3381,7 +3560,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Program", () {
     unittest.test("to-json--from-json", () {
       var o = buildProgram();
@@ -3390,7 +3568,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Range", () {
     unittest.test("to-json--from-json", () {
       var o = buildRange();
@@ -3399,7 +3576,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Read", () {
     unittest.test("to-json--from-json", () {
       var o = buildRead();
@@ -3408,7 +3584,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadGroup", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadGroup();
@@ -3417,7 +3592,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadGroupSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadGroupSet();
@@ -3426,7 +3600,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Reference", () {
     unittest.test("to-json--from-json", () {
       var o = buildReference();
@@ -3435,7 +3608,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReferenceBound", () {
     unittest.test("to-json--from-json", () {
       var o = buildReferenceBound();
@@ -3444,7 +3616,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReferenceSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildReferenceSet();
@@ -3453,7 +3624,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RuntimeMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildRuntimeMetadata();
@@ -3462,7 +3632,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchAnnotationSetsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchAnnotationSetsRequest();
@@ -3471,7 +3640,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchAnnotationSetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchAnnotationSetsResponse();
@@ -3480,7 +3648,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchAnnotationsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchAnnotationsRequest();
@@ -3489,7 +3656,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchAnnotationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchAnnotationsResponse();
@@ -3498,7 +3664,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchCallSetsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchCallSetsRequest();
@@ -3507,7 +3672,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchCallSetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchCallSetsResponse();
@@ -3516,7 +3680,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReadGroupSetsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReadGroupSetsRequest();
@@ -3525,7 +3688,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReadGroupSetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReadGroupSetsResponse();
@@ -3534,7 +3696,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReadsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReadsRequest();
@@ -3543,7 +3704,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReadsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReadsResponse();
@@ -3552,7 +3712,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReferenceSetsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReferenceSetsRequest();
@@ -3561,7 +3720,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReferenceSetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReferenceSetsResponse();
@@ -3570,7 +3728,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReferencesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReferencesRequest();
@@ -3579,7 +3736,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchReferencesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchReferencesResponse();
@@ -3588,7 +3744,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchVariantSetsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchVariantSetsRequest();
@@ -3597,7 +3752,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchVariantSetsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchVariantSetsResponse();
@@ -3606,7 +3760,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchVariantsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchVariantsRequest();
@@ -3615,7 +3768,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchVariantsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchVariantsResponse();
@@ -3624,7 +3776,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -3633,7 +3784,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -3642,7 +3792,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -3651,7 +3800,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -3660,7 +3808,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Transcript", () {
     unittest.test("to-json--from-json", () {
       var o = buildTranscript();
@@ -3669,7 +3816,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UndeleteDatasetRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUndeleteDatasetRequest();
@@ -3678,7 +3824,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Variant", () {
     unittest.test("to-json--from-json", () {
       var o = buildVariant();
@@ -3687,7 +3832,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VariantAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildVariantAnnotation();
@@ -3696,7 +3840,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VariantCall", () {
     unittest.test("to-json--from-json", () {
       var o = buildVariantCall();
@@ -3705,7 +3848,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VariantSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildVariantSet();
@@ -3714,7 +3856,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VariantSetMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildVariantSetMetadata();
@@ -3723,10 +3864,8 @@
     });
   });
 
-
   unittest.group("resource-AnnotationsResourceApi", () {
     unittest.test("method--batchCreate", () {
-
       var mock = new HttpServerMock();
       api.AnnotationsResourceApi res = new api.GenomicsApi(mock).annotations;
       var arg_request = buildBatchCreateAnnotationsRequest();
@@ -3738,9 +3877,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("v1/annotations:batchCreate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("v1/annotations:batchCreate"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -3753,27 +3894,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBatchCreateAnnotationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.batchCreate(arg_request).then(unittest.expectAsync1(((api.BatchCreateAnnotationsResponse response) {
+      res.batchCreate(arg_request).then(
+          unittest.expectAsync1(((api.BatchCreateAnnotationsResponse response) {
         checkBatchCreateAnnotationsResponse(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.AnnotationsResourceApi res = new api.GenomicsApi(mock).annotations;
       var arg_request = buildAnnotation();
@@ -3785,9 +3927,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/annotations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/annotations"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -3800,27 +3944,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Annotation response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Annotation response) {
         checkAnnotation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.AnnotationsResourceApi res = new api.GenomicsApi(mock).annotations;
       var arg_annotationId = "foo";
@@ -3829,9 +3975,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/annotations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/annotations/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3847,27 +3995,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_annotationId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_annotationId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.AnnotationsResourceApi res = new api.GenomicsApi(mock).annotations;
       var arg_annotationId = "foo";
@@ -3876,9 +4026,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/annotations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/annotations/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3894,27 +4046,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_annotationId).then(unittest.expectAsync1(((api.Annotation response) {
+      res
+          .get(arg_annotationId)
+          .then(unittest.expectAsync1(((api.Annotation response) {
         checkAnnotation(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.AnnotationsResourceApi res = new api.GenomicsApi(mock).annotations;
       var arg_request = buildSearchAnnotationsRequest();
@@ -3926,9 +4080,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("v1/annotations/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("v1/annotations/search"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -3941,27 +4097,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchAnnotationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchAnnotationsResponse response) {
+      res.search(arg_request).then(
+          unittest.expectAsync1(((api.SearchAnnotationsResponse response) {
         checkSearchAnnotationsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.AnnotationsResourceApi res = new api.GenomicsApi(mock).annotations;
       var arg_request = buildAnnotation();
@@ -3975,9 +4132,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/annotations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/annotations/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -3993,34 +4152,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_annotationId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Annotation response) {
+      res
+          .update(arg_request, arg_annotationId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Annotation response) {
         checkAnnotation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-AnnotationsetsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.AnnotationsetsResourceApi res = new api.GenomicsApi(mock).annotationsets;
+      api.AnnotationsetsResourceApi res =
+          new api.GenomicsApi(mock).annotationsets;
       var arg_request = buildAnnotationSet();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.AnnotationSet.fromJson(json);
@@ -4030,9 +4191,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/annotationsets"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/annotationsets"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -4045,38 +4208,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotationSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.AnnotationSet response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.AnnotationSet response) {
         checkAnnotationSet(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.AnnotationsetsResourceApi res = new api.GenomicsApi(mock).annotationsets;
+      api.AnnotationsetsResourceApi res =
+          new api.GenomicsApi(mock).annotationsets;
       var arg_annotationSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/annotationsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/annotationsets/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4092,38 +4260,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_annotationSetId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_annotationSetId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AnnotationsetsResourceApi res = new api.GenomicsApi(mock).annotationsets;
+      api.AnnotationsetsResourceApi res =
+          new api.GenomicsApi(mock).annotationsets;
       var arg_annotationSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/annotationsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/annotationsets/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4139,29 +4312,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotationSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_annotationSetId).then(unittest.expectAsync1(((api.AnnotationSet response) {
+      res
+          .get(arg_annotationSetId)
+          .then(unittest.expectAsync1(((api.AnnotationSet response) {
         checkAnnotationSet(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
-      api.AnnotationsetsResourceApi res = new api.GenomicsApi(mock).annotationsets;
+      api.AnnotationsetsResourceApi res =
+          new api.GenomicsApi(mock).annotationsets;
       var arg_request = buildSearchAnnotationSetsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.SearchAnnotationSetsRequest.fromJson(json);
@@ -4171,9 +4347,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("v1/annotationsets/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24),
+            unittest.equals("v1/annotationsets/search"));
         pathOffset += 24;
 
         var query = (req.url).query;
@@ -4186,29 +4364,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchAnnotationSetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchAnnotationSetsResponse response) {
+      res.search(arg_request).then(
+          unittest.expectAsync1(((api.SearchAnnotationSetsResponse response) {
         checkSearchAnnotationSetsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.AnnotationsetsResourceApi res = new api.GenomicsApi(mock).annotationsets;
+      api.AnnotationsetsResourceApi res =
+          new api.GenomicsApi(mock).annotationsets;
       var arg_request = buildAnnotationSet();
       var arg_annotationSetId = "foo";
       var arg_updateMask = "foo";
@@ -4220,9 +4400,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/annotationsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/annotationsets/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4238,32 +4420,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotationSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_annotationSetId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.AnnotationSet response) {
+      res
+          .update(arg_request, arg_annotationSetId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.AnnotationSet response) {
         checkAnnotationSet(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CallsetsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
       var arg_request = buildCallSet();
@@ -4275,9 +4458,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/callsets"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/callsets"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -4290,27 +4475,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.CallSet response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.CallSet response) {
         checkCallSet(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
       var arg_callSetId = "foo";
@@ -4319,9 +4506,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/callsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/callsets/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4337,27 +4526,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_callSetId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_callSetId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
       var arg_callSetId = "foo";
@@ -4366,9 +4557,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/callsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/callsets/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4384,27 +4577,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_callSetId).then(unittest.expectAsync1(((api.CallSet response) {
+      res
+          .get(arg_callSetId)
+          .then(unittest.expectAsync1(((api.CallSet response) {
         checkCallSet(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
       var arg_request = buildCallSet();
@@ -4418,9 +4613,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/callsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/callsets/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4436,28 +4633,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_callSetId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.CallSet response) {
+      res
+          .patch(arg_request, arg_callSetId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.CallSet response) {
         checkCallSet(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
       var arg_request = buildSearchCallSetsRequest();
@@ -4469,9 +4669,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/callsets/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/callsets/search"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -4484,31 +4686,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchCallSetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchCallSetsResponse response) {
+      res
+          .search(arg_request)
+          .then(unittest.expectAsync1(((api.SearchCallSetsResponse response) {
         checkSearchCallSetsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-DatasetsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_request = buildDataset();
@@ -4520,9 +4722,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/datasets"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/datasets"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -4535,27 +4739,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataset());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Dataset response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Dataset response) {
         checkDataset(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_datasetId = "foo";
@@ -4564,9 +4770,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/datasets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/datasets/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4582,27 +4790,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_datasetId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_datasetId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_datasetId = "foo";
@@ -4611,9 +4821,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/datasets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/datasets/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4629,27 +4841,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataset());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_datasetId).then(unittest.expectAsync1(((api.Dataset response) {
+      res
+          .get(arg_datasetId)
+          .then(unittest.expectAsync1(((api.Dataset response) {
         checkDataset(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_request = buildGetIamPolicyRequest();
@@ -4662,9 +4876,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4678,40 +4894,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
-      var arg_projectId = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/datasets"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/datasets"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -4724,30 +4944,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projectId"].first, unittest.equals(arg_projectId));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["projectId"].first, unittest.equals(arg_projectId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListDatasetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(projectId: arg_projectId, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListDatasetsResponse response) {
+      res
+          .list(
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              projectId: arg_projectId)
+          .then(unittest.expectAsync1(((api.ListDatasetsResponse response) {
         checkListDatasetsResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_request = buildDataset();
@@ -4761,9 +4989,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/datasets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/datasets/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4779,28 +5009,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataset());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_datasetId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Dataset response) {
+      res
+          .patch(arg_request, arg_datasetId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Dataset response) {
         checkDataset(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_request = buildSetIamPolicyRequest();
@@ -4813,9 +5046,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4829,27 +5064,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_request = buildTestIamPermissionsRequest();
@@ -4862,9 +5099,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4878,27 +5117,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--undelete", () {
-
       var mock = new HttpServerMock();
       api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
       var arg_request = buildUndeleteDatasetRequest();
@@ -4911,16 +5151,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/datasets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/datasets/"));
         pathOffset += 12;
         index = path.indexOf(":undelete", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":undelete"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":undelete"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -4933,31 +5177,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDataset());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.undelete(arg_request, arg_datasetId).then(unittest.expectAsync1(((api.Dataset response) {
+      res
+          .undelete(arg_request, arg_datasetId)
+          .then(unittest.expectAsync1(((api.Dataset response) {
         checkDataset(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.GenomicsApi(mock).operations;
       var arg_request = buildCancelOperationRequest();
@@ -4970,9 +5214,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4986,27 +5232,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .cancel(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.GenomicsApi(mock).operations;
       var arg_name = "foo";
@@ -5015,9 +5263,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -5031,16 +5281,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -5051,7 +5302,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.GenomicsApi(mock).operations;
       var arg_name = "foo";
@@ -5063,9 +5313,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -5079,45 +5331,53 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReadgroupsetsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      api.ReadgroupsetsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets;
       var arg_readGroupSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/readgroupsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/readgroupsets/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5133,29 +5393,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_readGroupSetId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_readGroupSetId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--export", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      api.ReadgroupsetsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets;
       var arg_request = buildExportReadGroupSetRequest();
       var arg_readGroupSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5166,16 +5429,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/readgroupsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/readgroupsets/"));
         pathOffset += 17;
         index = path.indexOf(":export", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_readGroupSetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":export"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":export"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -5188,38 +5455,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.export(arg_request, arg_readGroupSetId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .export(arg_request, arg_readGroupSetId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      api.ReadgroupsetsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets;
       var arg_readGroupSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/readgroupsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/readgroupsets/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5235,29 +5507,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReadGroupSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_readGroupSetId).then(unittest.expectAsync1(((api.ReadGroupSet response) {
+      res
+          .get(arg_readGroupSetId)
+          .then(unittest.expectAsync1(((api.ReadGroupSet response) {
         checkReadGroupSet(response);
       })));
     });
 
     unittest.test("method--import", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      api.ReadgroupsetsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets;
       var arg_request = buildImportReadGroupSetsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.ImportReadGroupSetsRequest.fromJson(json);
@@ -5267,9 +5542,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("v1/readgroupsets:import"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("v1/readgroupsets:import"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -5282,29 +5559,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.import(arg_request).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .import(arg_request)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      api.ReadgroupsetsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets;
       var arg_request = buildReadGroupSet();
       var arg_readGroupSetId = "foo";
       var arg_updateMask = "foo";
@@ -5316,9 +5596,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/readgroupsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/readgroupsets/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5334,30 +5616,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReadGroupSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_readGroupSetId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.ReadGroupSet response) {
+      res
+          .patch(arg_request, arg_readGroupSetId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.ReadGroupSet response) {
         checkReadGroupSet(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      api.ReadgroupsetsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets;
       var arg_request = buildSearchReadGroupSetsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.SearchReadGroupSetsRequest.fromJson(json);
@@ -5367,9 +5653,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("v1/readgroupsets/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("v1/readgroupsets/search"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -5382,55 +5670,59 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchReadGroupSetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchReadGroupSetsResponse response) {
+      res.search(arg_request).then(
+          unittest.expectAsync1(((api.SearchReadGroupSetsResponse response) {
         checkSearchReadGroupSetsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReadgroupsetsCoveragebucketsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ReadgroupsetsCoveragebucketsResourceApi res = new api.GenomicsApi(mock).readgroupsets.coveragebuckets;
+      api.ReadgroupsetsCoveragebucketsResourceApi res =
+          new api.GenomicsApi(mock).readgroupsets.coveragebuckets;
       var arg_readGroupSetId = "foo";
-      var arg_end = "foo";
-      var arg_pageToken = "foo";
-      var arg_pageSize = 42;
       var arg_start = "foo";
       var arg_targetBucketWidth = "foo";
       var arg_referenceName = "foo";
+      var arg_end = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/readgroupsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/readgroupsets/"));
         pathOffset += 17;
         index = path.indexOf("/coveragebuckets", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_readGroupSetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/coveragebuckets"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("/coveragebuckets"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -5443,37 +5735,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["end"].first, unittest.equals(arg_end));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["start"].first, unittest.equals(arg_start));
-        unittest.expect(queryMap["targetBucketWidth"].first, unittest.equals(arg_targetBucketWidth));
-        unittest.expect(queryMap["referenceName"].first, unittest.equals(arg_referenceName));
-
+        unittest.expect(queryMap["targetBucketWidth"].first,
+            unittest.equals(arg_targetBucketWidth));
+        unittest.expect(queryMap["referenceName"].first,
+            unittest.equals(arg_referenceName));
+        unittest.expect(queryMap["end"].first, unittest.equals(arg_end));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListCoverageBucketsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_readGroupSetId, end: arg_end, pageToken: arg_pageToken, pageSize: arg_pageSize, start: arg_start, targetBucketWidth: arg_targetBucketWidth, referenceName: arg_referenceName).then(unittest.expectAsync1(((api.ListCoverageBucketsResponse response) {
+      res
+          .list(arg_readGroupSetId,
+              start: arg_start,
+              targetBucketWidth: arg_targetBucketWidth,
+              referenceName: arg_referenceName,
+              end: arg_end,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.ListCoverageBucketsResponse response) {
         checkListCoverageBucketsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReadsResourceApi", () {
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.ReadsResourceApi res = new api.GenomicsApi(mock).reads;
       var arg_request = buildSearchReadsRequest();
@@ -5485,9 +5788,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/reads/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/reads/search"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -5500,31 +5805,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchReadsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchReadsResponse response) {
+      res
+          .search(arg_request)
+          .then(unittest.expectAsync1(((api.SearchReadsResponse response) {
         checkSearchReadsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReferencesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ReferencesResourceApi res = new api.GenomicsApi(mock).references;
       var arg_referenceId = "foo";
@@ -5533,9 +5838,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/references/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/references/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5551,27 +5858,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReference());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_referenceId).then(unittest.expectAsync1(((api.Reference response) {
+      res
+          .get(arg_referenceId)
+          .then(unittest.expectAsync1(((api.Reference response) {
         checkReference(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.ReferencesResourceApi res = new api.GenomicsApi(mock).references;
       var arg_request = buildSearchReferencesRequest();
@@ -5583,9 +5892,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("v1/references/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("v1/references/search"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -5598,53 +5909,58 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchReferencesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchReferencesResponse response) {
+      res
+          .search(arg_request)
+          .then(unittest.expectAsync1(((api.SearchReferencesResponse response) {
         checkSearchReferencesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReferencesBasesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ReferencesBasesResourceApi res = new api.GenomicsApi(mock).references.bases;
+      api.ReferencesBasesResourceApi res =
+          new api.GenomicsApi(mock).references.bases;
       var arg_referenceId = "foo";
-      var arg_pageSize = 42;
       var arg_start = "foo";
       var arg_end = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/references/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/references/"));
         pathOffset += 14;
         index = path.indexOf("/bases", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_referenceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/bases"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/bases"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -5657,46 +5973,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["start"].first, unittest.equals(arg_start));
         unittest.expect(queryMap["end"].first, unittest.equals(arg_end));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListBasesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_referenceId, pageSize: arg_pageSize, start: arg_start, end: arg_end, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListBasesResponse response) {
+      res
+          .list(arg_referenceId,
+              start: arg_start,
+              end: arg_end,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListBasesResponse response) {
         checkListBasesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReferencesetsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ReferencesetsResourceApi res = new api.GenomicsApi(mock).referencesets;
+      api.ReferencesetsResourceApi res =
+          new api.GenomicsApi(mock).referencesets;
       var arg_referenceSetId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/referencesets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/referencesets/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5712,29 +6037,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReferenceSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_referenceSetId).then(unittest.expectAsync1(((api.ReferenceSet response) {
+      res
+          .get(arg_referenceSetId)
+          .then(unittest.expectAsync1(((api.ReferenceSet response) {
         checkReferenceSet(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
-      api.ReferencesetsResourceApi res = new api.GenomicsApi(mock).referencesets;
+      api.ReferencesetsResourceApi res =
+          new api.GenomicsApi(mock).referencesets;
       var arg_request = buildSearchReferenceSetsRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.SearchReferenceSetsRequest.fromJson(json);
@@ -5744,9 +6072,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("v1/referencesets/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("v1/referencesets/search"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -5759,31 +6089,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchReferenceSetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchReferenceSetsResponse response) {
+      res.search(arg_request).then(
+          unittest.expectAsync1(((api.SearchReferenceSetsResponse response) {
         checkSearchReferenceSetsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VariantsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_request = buildVariant();
@@ -5795,9 +6124,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/variants"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/variants"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -5810,27 +6141,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVariant());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Variant response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Variant response) {
         checkVariant(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_variantId = "foo";
@@ -5839,9 +6172,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/variants/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/variants/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5857,27 +6192,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_variantId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_variantId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_variantId = "foo";
@@ -5886,9 +6223,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/variants/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/variants/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5904,27 +6243,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVariant());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_variantId).then(unittest.expectAsync1(((api.Variant response) {
+      res
+          .get(arg_variantId)
+          .then(unittest.expectAsync1(((api.Variant response) {
         checkVariant(response);
       })));
     });
 
     unittest.test("method--import", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_request = buildImportVariantsRequest();
@@ -5936,9 +6277,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/variants:import"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/variants:import"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -5951,27 +6294,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.import(arg_request).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .import(arg_request)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--merge", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_request = buildMergeVariantsRequest();
@@ -5983,9 +6328,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/variants:merge"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/variants:merge"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -5998,16 +6345,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -6018,7 +6366,6 @@
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_request = buildVariant();
@@ -6032,9 +6379,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/variants/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/variants/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6050,28 +6399,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVariant());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_variantId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.Variant response) {
+      res
+          .patch(arg_request, arg_variantId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.Variant response) {
         checkVariant(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
       var arg_request = buildSearchVariantsRequest();
@@ -6083,9 +6435,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/variants/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/variants/search"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -6098,31 +6452,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchVariantsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchVariantsResponse response) {
+      res
+          .search(arg_request)
+          .then(unittest.expectAsync1(((api.SearchVariantsResponse response) {
         checkSearchVariantsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VariantsetsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
       var arg_request = buildVariantSet();
@@ -6134,9 +6488,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/variantsets"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/variantsets"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -6149,27 +6505,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVariantSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.VariantSet response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.VariantSet response) {
         checkVariantSet(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
       var arg_variantSetId = "foo";
@@ -6178,9 +6536,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/variantsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/variantsets/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6196,27 +6556,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_variantSetId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_variantSetId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--export", () {
-
       var mock = new HttpServerMock();
       api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
       var arg_request = buildExportVariantSetRequest();
@@ -6229,16 +6591,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/variantsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/variantsets/"));
         pathOffset += 15;
         index = path.indexOf(":export", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":export"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":export"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -6251,27 +6617,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.export(arg_request, arg_variantSetId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .export(arg_request, arg_variantSetId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
       var arg_variantSetId = "foo";
@@ -6280,9 +6648,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/variantsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/variantsets/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6298,27 +6668,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVariantSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_variantSetId).then(unittest.expectAsync1(((api.VariantSet response) {
+      res
+          .get(arg_variantSetId)
+          .then(unittest.expectAsync1(((api.VariantSet response) {
         checkVariantSet(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
       var arg_request = buildVariantSet();
@@ -6332,9 +6704,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/variantsets/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/variantsets/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -6350,28 +6724,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["updateMask"].first, unittest.equals(arg_updateMask));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVariantSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_variantSetId, updateMask: arg_updateMask).then(unittest.expectAsync1(((api.VariantSet response) {
+      res
+          .patch(arg_request, arg_variantSetId, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.VariantSet response) {
         checkVariantSet(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
       var arg_request = buildSearchVariantSetsRequest();
@@ -6383,9 +6760,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("v1/variantsets/search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("v1/variantsets/search"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -6398,27 +6777,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchVariantSetsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.SearchVariantSetsResponse response) {
+      res.search(arg_request).then(
+          unittest.expectAsync1(((api.SearchVariantSetsResponse response) {
         checkSearchVariantSetsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/groupsmigration/v1_test.dart b/generated/googleapis/test/groupsmigration/v1_test.dart
index e26d3f0..90b9d1f 100644
--- a/generated/googleapis/test/groupsmigration/v1_test.dart
+++ b/generated/googleapis/test/groupsmigration/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.groupsmigration.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/groupsmigration/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -72,7 +71,6 @@
   buildCounterGroups--;
 }
 
-
 main() {
   unittest.group("obj-schema-Groups", () {
     unittest.test("to-json--from-json", () {
@@ -82,7 +80,6 @@
     });
   });
 
-
   unittest.group("resource-ArchiveResourceApi", () {
     unittest.test("method--insert", () {
       // TODO: Implement tests for media upload;
@@ -96,7 +93,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -109,27 +107,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroups());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_groupId).then(unittest.expectAsync1(((api.Groups response) {
+      res
+          .insert(arg_groupId)
+          .then(unittest.expectAsync1(((api.Groups response) {
         checkGroups(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/groupssettings/v1_test.dart b/generated/googleapis/test/groupssettings/v1_test.dart
index 299cb55..c6302c4 100644
--- a/generated/googleapis/test/groupssettings/v1_test.dart
+++ b/generated/googleapis/test/groupssettings/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.groupssettings.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/groupssettings/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -101,7 +100,8 @@
     unittest.expect(o.archiveOnly, unittest.equals('foo'));
     unittest.expect(o.customFooterText, unittest.equals('foo'));
     unittest.expect(o.customReplyTo, unittest.equals('foo'));
-    unittest.expect(o.defaultMessageDenyNotificationText, unittest.equals('foo'));
+    unittest.expect(
+        o.defaultMessageDenyNotificationText, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.includeCustomFooter, unittest.equals('foo'));
@@ -130,7 +130,6 @@
   buildCounterGroups--;
 }
 
-
 main() {
   unittest.group("obj-schema-Groups", () {
     unittest.test("to-json--from-json", () {
@@ -140,10 +139,8 @@
     });
   });
 
-
   unittest.group("resource-GroupsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.GroupssettingsApi(mock).groups;
       var arg_groupUniqueId = "foo";
@@ -152,7 +149,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -165,27 +163,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroups());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_groupUniqueId).then(unittest.expectAsync1(((api.Groups response) {
+      res
+          .get(arg_groupUniqueId)
+          .then(unittest.expectAsync1(((api.Groups response) {
         checkGroups(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.GroupssettingsApi(mock).groups;
       var arg_request = buildGroups();
@@ -198,7 +198,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -211,27 +212,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroups());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_groupUniqueId).then(unittest.expectAsync1(((api.Groups response) {
+      res
+          .patch(arg_request, arg_groupUniqueId)
+          .then(unittest.expectAsync1(((api.Groups response) {
         checkGroups(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.GroupssettingsApi(mock).groups;
       var arg_request = buildGroups();
@@ -244,7 +247,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -257,27 +261,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroups());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_groupUniqueId).then(unittest.expectAsync1(((api.Groups response) {
+      res
+          .update(arg_request, arg_groupUniqueId)
+          .then(unittest.expectAsync1(((api.Groups response) {
         checkGroups(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index dbafb0d..775f613 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -1,12 +1,10 @@
 library googleapis.identitytoolkit.v3.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/identitytoolkit/v3.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2453() {
+buildUnnamed2440() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2453(core.List<core.String> o) {
+checkUnnamed2440(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -69,7 +68,7 @@
   var o = new api.CreateAuthUriResponse();
   buildCounterCreateAuthUriResponse++;
   if (buildCounterCreateAuthUriResponse < 3) {
-    o.allProviders = buildUnnamed2453();
+    o.allProviders = buildUnnamed2440();
     o.authUri = "foo";
     o.captchaRequired = true;
     o.forExistingProvider = true;
@@ -85,7 +84,7 @@
 checkCreateAuthUriResponse(api.CreateAuthUriResponse o) {
   buildCounterCreateAuthUriResponse++;
   if (buildCounterCreateAuthUriResponse < 3) {
-    checkUnnamed2453(o.allProviders);
+    checkUnnamed2440(o.allProviders);
     unittest.expect(o.authUri, unittest.equals('foo'));
     unittest.expect(o.captchaRequired, unittest.isTrue);
     unittest.expect(o.forExistingProvider, unittest.isTrue);
@@ -116,14 +115,14 @@
   buildCounterDeleteAccountResponse--;
 }
 
-buildUnnamed2454() {
+buildUnnamed2441() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed2454(core.List<api.UserInfo> o) {
+checkUnnamed2441(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -136,7 +135,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.users = buildUnnamed2454();
+    o.users = buildUnnamed2441();
   }
   buildCounterDownloadAccountResponse--;
   return o;
@@ -147,7 +146,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2454(o.users);
+    checkUnnamed2441(o.users);
   }
   buildCounterDownloadAccountResponse--;
 }
@@ -181,14 +180,14 @@
   buildCounterEmailTemplate--;
 }
 
-buildUnnamed2455() {
+buildUnnamed2442() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed2455(core.List<api.UserInfo> o) {
+checkUnnamed2442(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -200,7 +199,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     o.kind = "foo";
-    o.users = buildUnnamed2455();
+    o.users = buildUnnamed2442();
   }
   buildCounterGetAccountInfoResponse--;
   return o;
@@ -210,7 +209,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2455(o.users);
+    checkUnnamed2442(o.users);
   }
   buildCounterGetAccountInfoResponse--;
 }
@@ -261,14 +260,14 @@
   buildCounterGetRecaptchaParamResponse--;
 }
 
-buildUnnamed2456() {
+buildUnnamed2443() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2456(core.Map<core.String, core.String> o) {
+checkUnnamed2443(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -284,7 +283,7 @@
     o.clientId = "foo";
     o.context = "foo";
     o.continueUri = "foo";
-    o.customParameter = buildUnnamed2456();
+    o.customParameter = buildUnnamed2443();
     o.hostedDomain = "foo";
     o.identifier = "foo";
     o.oauthConsumerKey = "foo";
@@ -298,7 +297,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(api.IdentitytoolkitRelyingpartyCreateAuthUriRequest o) {
+checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(
+    api.IdentitytoolkitRelyingpartyCreateAuthUriRequest o) {
   buildCounterIdentitytoolkitRelyingpartyCreateAuthUriRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyCreateAuthUriRequest < 3) {
     unittest.expect(o.appId, unittest.equals('foo'));
@@ -306,7 +306,7 @@
     unittest.expect(o.clientId, unittest.equals('foo'));
     unittest.expect(o.context, unittest.equals('foo'));
     unittest.expect(o.continueUri, unittest.equals('foo'));
-    checkUnnamed2456(o.customParameter);
+    checkUnnamed2443(o.customParameter);
     unittest.expect(o.hostedDomain, unittest.equals('foo'));
     unittest.expect(o.identifier, unittest.equals('foo'));
     unittest.expect(o.oauthConsumerKey, unittest.equals('foo'));
@@ -332,7 +332,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyDeleteAccountRequest(api.IdentitytoolkitRelyingpartyDeleteAccountRequest o) {
+checkIdentitytoolkitRelyingpartyDeleteAccountRequest(
+    api.IdentitytoolkitRelyingpartyDeleteAccountRequest o) {
   buildCounterIdentitytoolkitRelyingpartyDeleteAccountRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyDeleteAccountRequest < 3) {
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
@@ -356,7 +357,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyDownloadAccountRequest(api.IdentitytoolkitRelyingpartyDownloadAccountRequest o) {
+checkIdentitytoolkitRelyingpartyDownloadAccountRequest(
+    api.IdentitytoolkitRelyingpartyDownloadAccountRequest o) {
   buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest < 3) {
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
@@ -367,40 +369,40 @@
   buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest--;
 }
 
-buildUnnamed2457() {
+buildUnnamed2444() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2457(core.List<core.String> o) {
+checkUnnamed2444(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2458() {
+buildUnnamed2445() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2458(core.List<core.String> o) {
+checkUnnamed2445(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2459() {
+buildUnnamed2446() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2459(core.List<core.String> o) {
+checkUnnamed2446(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -412,48 +414,49 @@
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
     o.delegatedProjectNumber = "foo";
-    o.email = buildUnnamed2457();
+    o.email = buildUnnamed2444();
     o.idToken = "foo";
-    o.localId = buildUnnamed2458();
-    o.phoneNumber = buildUnnamed2459();
+    o.localId = buildUnnamed2445();
+    o.phoneNumber = buildUnnamed2446();
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(api.IdentitytoolkitRelyingpartyGetAccountInfoRequest o) {
+checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(
+    api.IdentitytoolkitRelyingpartyGetAccountInfoRequest o) {
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
-    checkUnnamed2457(o.email);
+    checkUnnamed2444(o.email);
     unittest.expect(o.idToken, unittest.equals('foo'));
-    checkUnnamed2458(o.localId);
-    checkUnnamed2459(o.phoneNumber);
+    checkUnnamed2445(o.localId);
+    checkUnnamed2446(o.phoneNumber);
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
 }
 
-buildUnnamed2460() {
+buildUnnamed2447() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2460(core.List<core.String> o) {
+checkUnnamed2447(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2461() {
+buildUnnamed2448() {
   var o = new core.List<api.IdpConfig>();
   o.add(buildIdpConfig());
   o.add(buildIdpConfig());
   return o;
 }
 
-checkUnnamed2461(core.List<api.IdpConfig> o) {
+checkUnnamed2448(core.List<api.IdpConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIdpConfig(o[0]);
   checkIdpConfig(o[1]);
@@ -466,11 +469,11 @@
   if (buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse < 3) {
     o.allowPasswordUser = true;
     o.apiKey = "foo";
-    o.authorizedDomains = buildUnnamed2460();
+    o.authorizedDomains = buildUnnamed2447();
     o.changeEmailTemplate = buildEmailTemplate();
     o.dynamicLinksDomain = "foo";
     o.enableAnonymousUser = true;
-    o.idpConfig = buildUnnamed2461();
+    o.idpConfig = buildUnnamed2448();
     o.legacyResetPasswordTemplate = buildEmailTemplate();
     o.projectId = "foo";
     o.resetPasswordTemplate = buildEmailTemplate();
@@ -481,16 +484,17 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(api.IdentitytoolkitRelyingpartyGetProjectConfigResponse o) {
+checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(
+    api.IdentitytoolkitRelyingpartyGetProjectConfigResponse o) {
   buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse++;
   if (buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse < 3) {
     unittest.expect(o.allowPasswordUser, unittest.isTrue);
     unittest.expect(o.apiKey, unittest.equals('foo'));
-    checkUnnamed2460(o.authorizedDomains);
+    checkUnnamed2447(o.authorizedDomains);
     checkEmailTemplate(o.changeEmailTemplate);
     unittest.expect(o.dynamicLinksDomain, unittest.equals('foo'));
     unittest.expect(o.enableAnonymousUser, unittest.isTrue);
-    checkUnnamed2461(o.idpConfig);
+    checkUnnamed2448(o.idpConfig);
     checkEmailTemplate(o.legacyResetPasswordTemplate);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkEmailTemplate(o.resetPasswordTemplate);
@@ -507,7 +511,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(api.IdentitytoolkitRelyingpartyGetPublicKeysResponse o) {
+checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(
+    api.IdentitytoolkitRelyingpartyGetPublicKeysResponse o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["a"], unittest.equals('foo'));
   unittest.expect(o["b"], unittest.equals('foo'));
@@ -527,7 +532,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyResetPasswordRequest(api.IdentitytoolkitRelyingpartyResetPasswordRequest o) {
+checkIdentitytoolkitRelyingpartyResetPasswordRequest(
+    api.IdentitytoolkitRelyingpartyResetPasswordRequest o) {
   buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
@@ -538,40 +544,87 @@
   buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest--;
 }
 
-buildUnnamed2462() {
+core.int buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest = 0;
+buildIdentitytoolkitRelyingpartySendVerificationCodeRequest() {
+  var o = new api.IdentitytoolkitRelyingpartySendVerificationCodeRequest();
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest++;
+  if (buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest < 3) {
+    o.iosReceipt = "foo";
+    o.iosSecret = "foo";
+    o.phoneNumber = "foo";
+    o.recaptchaToken = "foo";
+  }
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest--;
+  return o;
+}
+
+checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(
+    api.IdentitytoolkitRelyingpartySendVerificationCodeRequest o) {
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest++;
+  if (buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest < 3) {
+    unittest.expect(o.iosReceipt, unittest.equals('foo'));
+    unittest.expect(o.iosSecret, unittest.equals('foo'));
+    unittest.expect(o.phoneNumber, unittest.equals('foo'));
+    unittest.expect(o.recaptchaToken, unittest.equals('foo'));
+  }
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeRequest--;
+}
+
+core.int buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse =
+    0;
+buildIdentitytoolkitRelyingpartySendVerificationCodeResponse() {
+  var o = new api.IdentitytoolkitRelyingpartySendVerificationCodeResponse();
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse++;
+  if (buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse < 3) {
+    o.sessionInfo = "foo";
+  }
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse--;
+  return o;
+}
+
+checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(
+    api.IdentitytoolkitRelyingpartySendVerificationCodeResponse o) {
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse++;
+  if (buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse < 3) {
+    unittest.expect(o.sessionInfo, unittest.equals('foo'));
+  }
+  buildCounterIdentitytoolkitRelyingpartySendVerificationCodeResponse--;
+}
+
+buildUnnamed2449() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2462(core.List<core.String> o) {
+checkUnnamed2449(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2463() {
+buildUnnamed2450() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2463(core.List<core.String> o) {
+checkUnnamed2450(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2464() {
+buildUnnamed2451() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2464(core.List<core.String> o) {
+checkUnnamed2451(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -585,9 +638,10 @@
     o.captchaChallenge = "foo";
     o.captchaResponse = "foo";
     o.createdAt = "foo";
+    o.customAttributes = "foo";
     o.delegatedProjectNumber = "foo";
-    o.deleteAttribute = buildUnnamed2462();
-    o.deleteProvider = buildUnnamed2463();
+    o.deleteAttribute = buildUnnamed2449();
+    o.deleteProvider = buildUnnamed2450();
     o.disableUser = true;
     o.displayName = "foo";
     o.email = "foo";
@@ -600,7 +654,7 @@
     o.password = "foo";
     o.phoneNumber = "foo";
     o.photoUrl = "foo";
-    o.provider = buildUnnamed2464();
+    o.provider = buildUnnamed2451();
     o.returnSecureToken = true;
     o.upgradeToFederatedLogin = true;
     o.validSince = "foo";
@@ -609,15 +663,17 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartySetAccountInfoRequest(api.IdentitytoolkitRelyingpartySetAccountInfoRequest o) {
+checkIdentitytoolkitRelyingpartySetAccountInfoRequest(
+    api.IdentitytoolkitRelyingpartySetAccountInfoRequest o) {
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest < 3) {
     unittest.expect(o.captchaChallenge, unittest.equals('foo'));
     unittest.expect(o.captchaResponse, unittest.equals('foo'));
     unittest.expect(o.createdAt, unittest.equals('foo'));
+    unittest.expect(o.customAttributes, unittest.equals('foo'));
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
-    checkUnnamed2462(o.deleteAttribute);
-    checkUnnamed2463(o.deleteProvider);
+    checkUnnamed2449(o.deleteAttribute);
+    checkUnnamed2450(o.deleteProvider);
     unittest.expect(o.disableUser, unittest.isTrue);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -630,7 +686,7 @@
     unittest.expect(o.password, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2464(o.provider);
+    checkUnnamed2451(o.provider);
     unittest.expect(o.returnSecureToken, unittest.isTrue);
     unittest.expect(o.upgradeToFederatedLogin, unittest.isTrue);
     unittest.expect(o.validSince, unittest.equals('foo'));
@@ -638,27 +694,27 @@
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
 }
 
-buildUnnamed2465() {
+buildUnnamed2452() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2465(core.List<core.String> o) {
+checkUnnamed2452(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2466() {
+buildUnnamed2453() {
   var o = new core.List<api.IdpConfig>();
   o.add(buildIdpConfig());
   o.add(buildIdpConfig());
   return o;
 }
 
-checkUnnamed2466(core.List<api.IdpConfig> o) {
+checkUnnamed2453(core.List<api.IdpConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIdpConfig(o[0]);
   checkIdpConfig(o[1]);
@@ -671,11 +727,11 @@
   if (buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest < 3) {
     o.allowPasswordUser = true;
     o.apiKey = "foo";
-    o.authorizedDomains = buildUnnamed2465();
+    o.authorizedDomains = buildUnnamed2452();
     o.changeEmailTemplate = buildEmailTemplate();
     o.delegatedProjectNumber = "foo";
     o.enableAnonymousUser = true;
-    o.idpConfig = buildUnnamed2466();
+    o.idpConfig = buildUnnamed2453();
     o.legacyResetPasswordTemplate = buildEmailTemplate();
     o.resetPasswordTemplate = buildEmailTemplate();
     o.useEmailSending = true;
@@ -685,16 +741,17 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartySetProjectConfigRequest(api.IdentitytoolkitRelyingpartySetProjectConfigRequest o) {
+checkIdentitytoolkitRelyingpartySetProjectConfigRequest(
+    api.IdentitytoolkitRelyingpartySetProjectConfigRequest o) {
   buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest++;
   if (buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest < 3) {
     unittest.expect(o.allowPasswordUser, unittest.isTrue);
     unittest.expect(o.apiKey, unittest.equals('foo'));
-    checkUnnamed2465(o.authorizedDomains);
+    checkUnnamed2452(o.authorizedDomains);
     checkEmailTemplate(o.changeEmailTemplate);
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
     unittest.expect(o.enableAnonymousUser, unittest.isTrue);
-    checkUnnamed2466(o.idpConfig);
+    checkUnnamed2453(o.idpConfig);
     checkEmailTemplate(o.legacyResetPasswordTemplate);
     checkEmailTemplate(o.resetPasswordTemplate);
     unittest.expect(o.useEmailSending, unittest.isTrue);
@@ -714,7 +771,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartySetProjectConfigResponse(api.IdentitytoolkitRelyingpartySetProjectConfigResponse o) {
+checkIdentitytoolkitRelyingpartySetProjectConfigResponse(
+    api.IdentitytoolkitRelyingpartySetProjectConfigResponse o) {
   buildCounterIdentitytoolkitRelyingpartySetProjectConfigResponse++;
   if (buildCounterIdentitytoolkitRelyingpartySetProjectConfigResponse < 3) {
     unittest.expect(o.projectId, unittest.equals('foo'));
@@ -734,7 +792,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartySignOutUserRequest(api.IdentitytoolkitRelyingpartySignOutUserRequest o) {
+checkIdentitytoolkitRelyingpartySignOutUserRequest(
+    api.IdentitytoolkitRelyingpartySignOutUserRequest o) {
   buildCounterIdentitytoolkitRelyingpartySignOutUserRequest++;
   if (buildCounterIdentitytoolkitRelyingpartySignOutUserRequest < 3) {
     unittest.expect(o.instanceId, unittest.equals('foo'));
@@ -754,7 +813,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartySignOutUserResponse(api.IdentitytoolkitRelyingpartySignOutUserResponse o) {
+checkIdentitytoolkitRelyingpartySignOutUserResponse(
+    api.IdentitytoolkitRelyingpartySignOutUserResponse o) {
   buildCounterIdentitytoolkitRelyingpartySignOutUserResponse++;
   if (buildCounterIdentitytoolkitRelyingpartySignOutUserResponse < 3) {
     unittest.expect(o.localId, unittest.equals('foo'));
@@ -784,7 +844,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartySignupNewUserRequest(api.IdentitytoolkitRelyingpartySignupNewUserRequest o) {
+checkIdentitytoolkitRelyingpartySignupNewUserRequest(
+    api.IdentitytoolkitRelyingpartySignupNewUserRequest o) {
   buildCounterIdentitytoolkitRelyingpartySignupNewUserRequest++;
   if (buildCounterIdentitytoolkitRelyingpartySignupNewUserRequest < 3) {
     unittest.expect(o.captchaChallenge, unittest.equals('foo'));
@@ -803,14 +864,14 @@
   buildCounterIdentitytoolkitRelyingpartySignupNewUserRequest--;
 }
 
-buildUnnamed2467() {
+buildUnnamed2454() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed2467(core.List<api.UserInfo> o) {
+checkUnnamed2454(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -822,33 +883,42 @@
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest < 3) {
     o.allowOverwrite = true;
+    o.blockSize = 42;
+    o.cpuMemCost = 42;
     o.delegatedProjectNumber = "foo";
+    o.dkLen = 42;
     o.hashAlgorithm = "foo";
     o.memoryCost = 42;
+    o.parallelization = 42;
     o.rounds = 42;
     o.saltSeparator = "foo";
     o.sanityCheck = true;
     o.signerKey = "foo";
     o.targetProjectId = "foo";
-    o.users = buildUnnamed2467();
+    o.users = buildUnnamed2454();
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyUploadAccountRequest(api.IdentitytoolkitRelyingpartyUploadAccountRequest o) {
+checkIdentitytoolkitRelyingpartyUploadAccountRequest(
+    api.IdentitytoolkitRelyingpartyUploadAccountRequest o) {
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest < 3) {
     unittest.expect(o.allowOverwrite, unittest.isTrue);
+    unittest.expect(o.blockSize, unittest.equals(42));
+    unittest.expect(o.cpuMemCost, unittest.equals(42));
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
+    unittest.expect(o.dkLen, unittest.equals(42));
     unittest.expect(o.hashAlgorithm, unittest.equals('foo'));
     unittest.expect(o.memoryCost, unittest.equals(42));
+    unittest.expect(o.parallelization, unittest.equals(42));
     unittest.expect(o.rounds, unittest.equals(42));
     unittest.expect(o.saltSeparator, unittest.equals('foo'));
     unittest.expect(o.sanityCheck, unittest.isTrue);
     unittest.expect(o.signerKey, unittest.equals('foo'));
     unittest.expect(o.targetProjectId, unittest.equals('foo'));
-    checkUnnamed2467(o.users);
+    checkUnnamed2454(o.users);
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
 }
@@ -874,7 +944,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(api.IdentitytoolkitRelyingpartyVerifyAssertionRequest o) {
+checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(
+    api.IdentitytoolkitRelyingpartyVerifyAssertionRequest o) {
   buildCounterIdentitytoolkitRelyingpartyVerifyAssertionRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyVerifyAssertionRequest < 3) {
     unittest.expect(o.autoCreate, unittest.isTrue);
@@ -906,7 +977,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest o) {
+checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(
+    api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest o) {
   buildCounterIdentitytoolkitRelyingpartyVerifyCustomTokenRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyVerifyCustomTokenRequest < 3) {
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
@@ -936,7 +1008,8 @@
   return o;
 }
 
-checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(api.IdentitytoolkitRelyingpartyVerifyPasswordRequest o) {
+checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(
+    api.IdentitytoolkitRelyingpartyVerifyPasswordRequest o) {
   buildCounterIdentitytoolkitRelyingpartyVerifyPasswordRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyVerifyPasswordRequest < 3) {
     unittest.expect(o.captchaChallenge, unittest.equals('foo'));
@@ -952,14 +1025,84 @@
   buildCounterIdentitytoolkitRelyingpartyVerifyPasswordRequest--;
 }
 
-buildUnnamed2468() {
+core.int buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest = 0;
+buildIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest() {
+  var o = new api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest();
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest++;
+  if (buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest < 3) {
+    o.code = "foo";
+    o.idToken = "foo";
+    o.operation = "foo";
+    o.phoneNumber = "foo";
+    o.sessionInfo = "foo";
+    o.temporaryProof = "foo";
+    o.verificationProof = "foo";
+  }
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest--;
+  return o;
+}
+
+checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(
+    api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest o) {
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest++;
+  if (buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest < 3) {
+    unittest.expect(o.code, unittest.equals('foo'));
+    unittest.expect(o.idToken, unittest.equals('foo'));
+    unittest.expect(o.operation, unittest.equals('foo'));
+    unittest.expect(o.phoneNumber, unittest.equals('foo'));
+    unittest.expect(o.sessionInfo, unittest.equals('foo'));
+    unittest.expect(o.temporaryProof, unittest.equals('foo'));
+    unittest.expect(o.verificationProof, unittest.equals('foo'));
+  }
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest--;
+}
+
+core.int buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse = 0;
+buildIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse() {
+  var o = new api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse();
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse++;
+  if (buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse < 3) {
+    o.expiresIn = "foo";
+    o.idToken = "foo";
+    o.isNewUser = true;
+    o.localId = "foo";
+    o.phoneNumber = "foo";
+    o.refreshToken = "foo";
+    o.temporaryProof = "foo";
+    o.temporaryProofExpiresIn = "foo";
+    o.verificationProof = "foo";
+    o.verificationProofExpiresIn = "foo";
+  }
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse--;
+  return o;
+}
+
+checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(
+    api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse o) {
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse++;
+  if (buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse < 3) {
+    unittest.expect(o.expiresIn, unittest.equals('foo'));
+    unittest.expect(o.idToken, unittest.equals('foo'));
+    unittest.expect(o.isNewUser, unittest.isTrue);
+    unittest.expect(o.localId, unittest.equals('foo'));
+    unittest.expect(o.phoneNumber, unittest.equals('foo'));
+    unittest.expect(o.refreshToken, unittest.equals('foo'));
+    unittest.expect(o.temporaryProof, unittest.equals('foo'));
+    unittest.expect(o.temporaryProofExpiresIn, unittest.equals('foo'));
+    unittest.expect(o.verificationProof, unittest.equals('foo'));
+    unittest.expect(o.verificationProofExpiresIn, unittest.equals('foo'));
+  }
+  buildCounterIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse--;
+}
+
+buildUnnamed2455() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2468(core.List<core.String> o) {
+checkUnnamed2455(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -975,7 +1118,7 @@
     o.experimentPercent = 42;
     o.provider = "foo";
     o.secret = "foo";
-    o.whitelistedAudiences = buildUnnamed2468();
+    o.whitelistedAudiences = buildUnnamed2455();
   }
   buildCounterIdpConfig--;
   return o;
@@ -989,7 +1132,7 @@
     unittest.expect(o.experimentPercent, unittest.equals(42));
     unittest.expect(o.provider, unittest.equals('foo'));
     unittest.expect(o.secret, unittest.equals('foo'));
-    checkUnnamed2468(o.whitelistedAudiences);
+    checkUnnamed2455(o.whitelistedAudiences);
   }
   buildCounterIdpConfig--;
 }
@@ -1080,7 +1223,8 @@
   return o;
 }
 
-checkSetAccountInfoResponseProviderUserInfo(api.SetAccountInfoResponseProviderUserInfo o) {
+checkSetAccountInfoResponseProviderUserInfo(
+    api.SetAccountInfoResponseProviderUserInfo o) {
   buildCounterSetAccountInfoResponseProviderUserInfo++;
   if (buildCounterSetAccountInfoResponseProviderUserInfo < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
@@ -1091,14 +1235,14 @@
   buildCounterSetAccountInfoResponseProviderUserInfo--;
 }
 
-buildUnnamed2469() {
+buildUnnamed2456() {
   var o = new core.List<api.SetAccountInfoResponseProviderUserInfo>();
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   return o;
 }
 
-checkUnnamed2469(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
+checkUnnamed2456(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetAccountInfoResponseProviderUserInfo(o[0]);
   checkSetAccountInfoResponseProviderUserInfo(o[1]);
@@ -1119,7 +1263,7 @@
     o.newEmail = "foo";
     o.passwordHash = "foo";
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed2469();
+    o.providerUserInfo = buildUnnamed2456();
     o.refreshToken = "foo";
   }
   buildCounterSetAccountInfoResponse--;
@@ -1139,7 +1283,7 @@
     unittest.expect(o.newEmail, unittest.equals('foo'));
     unittest.expect(o.passwordHash, unittest.equals('foo'));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2469(o.providerUserInfo);
+    checkUnnamed2456(o.providerUserInfo);
     unittest.expect(o.refreshToken, unittest.equals('foo'));
   }
   buildCounterSetAccountInfoResponse--;
@@ -1197,14 +1341,14 @@
   buildCounterUploadAccountResponseError--;
 }
 
-buildUnnamed2470() {
+buildUnnamed2457() {
   var o = new core.List<api.UploadAccountResponseError>();
   o.add(buildUploadAccountResponseError());
   o.add(buildUploadAccountResponseError());
   return o;
 }
 
-checkUnnamed2470(core.List<api.UploadAccountResponseError> o) {
+checkUnnamed2457(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUploadAccountResponseError(o[0]);
   checkUploadAccountResponseError(o[1]);
@@ -1215,7 +1359,7 @@
   var o = new api.UploadAccountResponse();
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    o.error = buildUnnamed2470();
+    o.error = buildUnnamed2457();
     o.kind = "foo";
   }
   buildCounterUploadAccountResponse--;
@@ -1225,7 +1369,7 @@
 checkUploadAccountResponse(api.UploadAccountResponse o) {
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    checkUnnamed2470(o.error);
+    checkUnnamed2457(o.error);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUploadAccountResponse--;
@@ -1264,14 +1408,14 @@
   buildCounterUserInfoProviderUserInfo--;
 }
 
-buildUnnamed2471() {
+buildUnnamed2458() {
   var o = new core.List<api.UserInfoProviderUserInfo>();
   o.add(buildUserInfoProviderUserInfo());
   o.add(buildUserInfoProviderUserInfo());
   return o;
 }
 
-checkUnnamed2471(core.List<api.UserInfoProviderUserInfo> o) {
+checkUnnamed2458(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfoProviderUserInfo(o[0]);
   checkUserInfoProviderUserInfo(o[1]);
@@ -1283,6 +1427,7 @@
   buildCounterUserInfo++;
   if (buildCounterUserInfo < 3) {
     o.createdAt = "foo";
+    o.customAttributes = "foo";
     o.customAuth = true;
     o.disabled = true;
     o.displayName = "foo";
@@ -1294,7 +1439,7 @@
     o.passwordUpdatedAt = 42.0;
     o.phoneNumber = "foo";
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed2471();
+    o.providerUserInfo = buildUnnamed2458();
     o.rawPassword = "foo";
     o.salt = "foo";
     o.screenName = "foo";
@@ -1309,6 +1454,7 @@
   buildCounterUserInfo++;
   if (buildCounterUserInfo < 3) {
     unittest.expect(o.createdAt, unittest.equals('foo'));
+    unittest.expect(o.customAttributes, unittest.equals('foo'));
     unittest.expect(o.customAuth, unittest.isTrue);
     unittest.expect(o.disabled, unittest.isTrue);
     unittest.expect(o.displayName, unittest.equals('foo'));
@@ -1320,7 +1466,7 @@
     unittest.expect(o.passwordUpdatedAt, unittest.equals(42.0));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed2471(o.providerUserInfo);
+    checkUnnamed2458(o.providerUserInfo);
     unittest.expect(o.rawPassword, unittest.equals('foo'));
     unittest.expect(o.salt, unittest.equals('foo'));
     unittest.expect(o.screenName, unittest.equals('foo'));
@@ -1330,14 +1476,14 @@
   buildCounterUserInfo--;
 }
 
-buildUnnamed2472() {
+buildUnnamed2459() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2472(core.List<core.String> o) {
+checkUnnamed2459(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1386,7 +1532,7 @@
     o.refreshToken = "foo";
     o.screenName = "foo";
     o.timeZone = "foo";
-    o.verifiedProvider = buildUnnamed2472();
+    o.verifiedProvider = buildUnnamed2459();
   }
   buildCounterVerifyAssertionResponse--;
   return o;
@@ -1433,7 +1579,7 @@
     unittest.expect(o.refreshToken, unittest.equals('foo'));
     unittest.expect(o.screenName, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
-    checkUnnamed2472(o.verifiedProvider);
+    checkUnnamed2459(o.verifiedProvider);
   }
   buildCounterVerifyAssertionResponse--;
 }
@@ -1445,6 +1591,7 @@
   if (buildCounterVerifyCustomTokenResponse < 3) {
     o.expiresIn = "foo";
     o.idToken = "foo";
+    o.isNewUser = true;
     o.kind = "foo";
     o.refreshToken = "foo";
   }
@@ -1457,6 +1604,7 @@
   if (buildCounterVerifyCustomTokenResponse < 3) {
     unittest.expect(o.expiresIn, unittest.equals('foo'));
     unittest.expect(o.idToken, unittest.equals('foo'));
+    unittest.expect(o.isNewUser, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.refreshToken, unittest.equals('foo'));
   }
@@ -1504,7 +1652,6 @@
   buildCounterVerifyPasswordResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-CreateAuthUriResponse", () {
     unittest.test("to-json--from-json", () {
@@ -1514,7 +1661,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeleteAccountResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteAccountResponse();
@@ -1523,7 +1669,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DownloadAccountResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDownloadAccountResponse();
@@ -1532,7 +1677,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EmailTemplate", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmailTemplate();
@@ -1541,7 +1685,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetAccountInfoResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetAccountInfoResponse();
@@ -1550,7 +1693,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetOobConfirmationCodeResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetOobConfirmationCodeResponse();
@@ -1559,7 +1701,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetRecaptchaParamResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetRecaptchaParamResponse();
@@ -1568,159 +1709,229 @@
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyCreateAuthUriRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyCreateAuthUriRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyCreateAuthUriRequest();
-      var od = new api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyDeleteAccountRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyDeleteAccountRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyDeleteAccountRequest();
-      var od = new api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartyDeleteAccountRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyDownloadAccountRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyDownloadAccountRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyDownloadAccountRequest();
-      var od = new api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyDownloadAccountRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyGetAccountInfoRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyGetAccountInfoRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyGetAccountInfoRequest();
-      var od = new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyGetProjectConfigResponse", () {
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartyGetProjectConfigResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyGetProjectConfigResponse();
-      var od = new api.IdentitytoolkitRelyingpartyGetProjectConfigResponse.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyGetProjectConfigResponse.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyGetPublicKeysResponse", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyGetPublicKeysResponse",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyGetPublicKeysResponse();
-      var od = new api.IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyResetPasswordRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyResetPasswordRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyResetPasswordRequest();
-      var od = new api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartyResetPasswordRequest(od);
     });
   });
 
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartySendVerificationCodeRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildIdentitytoolkitRelyingpartySendVerificationCodeRequest();
+      var od = new api
+              .IdentitytoolkitRelyingpartySendVerificationCodeRequest.fromJson(
+          o.toJson());
+      checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(od);
+    });
+  });
 
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartySetAccountInfoRequest", () {
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartySendVerificationCodeResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildIdentitytoolkitRelyingpartySendVerificationCodeResponse();
+      var od = new api
+              .IdentitytoolkitRelyingpartySendVerificationCodeResponse.fromJson(
+          o.toJson());
+      checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(od);
+    });
+  });
+
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartySetAccountInfoRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartySetAccountInfoRequest();
-      var od = new api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartySetAccountInfoRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartySetProjectConfigRequest", () {
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartySetProjectConfigRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartySetProjectConfigRequest();
-      var od = new api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartySetProjectConfigRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartySetProjectConfigResponse", () {
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartySetProjectConfigResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartySetProjectConfigResponse();
-      var od = new api.IdentitytoolkitRelyingpartySetProjectConfigResponse.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartySetProjectConfigResponse.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartySetProjectConfigResponse(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartySignOutUserRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartySignOutUserRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartySignOutUserRequest();
-      var od = new api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartySignOutUserRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartySignOutUserResponse", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartySignOutUserResponse",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartySignOutUserResponse();
-      var od = new api.IdentitytoolkitRelyingpartySignOutUserResponse.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartySignOutUserResponse.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartySignOutUserResponse(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartySignupNewUserRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartySignupNewUserRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartySignupNewUserRequest();
-      var od = new api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartySignupNewUserRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyUploadAccountRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyUploadAccountRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyUploadAccountRequest();
-      var od = new api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(o.toJson());
+      var od = new api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(
+          o.toJson());
       checkIdentitytoolkitRelyingpartyUploadAccountRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyVerifyAssertionRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyVerifyAssertionRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyVerifyAssertionRequest();
-      var od = new api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyVerifyCustomTokenRequest", () {
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartyVerifyCustomTokenRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyVerifyCustomTokenRequest();
-      var od = new api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(od);
     });
   });
 
-
-  unittest.group("obj-schema-IdentitytoolkitRelyingpartyVerifyPasswordRequest", () {
+  unittest.group("obj-schema-IdentitytoolkitRelyingpartyVerifyPasswordRequest",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildIdentitytoolkitRelyingpartyVerifyPasswordRequest();
-      var od = new api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(o.toJson());
+      var od =
+          new api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(
+              o.toJson());
       checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(od);
     });
   });
 
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest();
+      var od =
+          new api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest.fromJson(
+              o.toJson());
+      checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(od);
+    });
+  });
+
+  unittest.group(
+      "obj-schema-IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse();
+      var od =
+          new api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse.fromJson(
+              o.toJson());
+      checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(od);
+    });
+  });
 
   unittest.group("obj-schema-IdpConfig", () {
     unittest.test("to-json--from-json", () {
@@ -1730,7 +1941,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Relyingparty", () {
     unittest.test("to-json--from-json", () {
       var o = buildRelyingparty();
@@ -1739,7 +1949,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResetPasswordResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildResetPasswordResponse();
@@ -1748,16 +1957,15 @@
     });
   });
 
-
   unittest.group("obj-schema-SetAccountInfoResponseProviderUserInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetAccountInfoResponseProviderUserInfo();
-      var od = new api.SetAccountInfoResponseProviderUserInfo.fromJson(o.toJson());
+      var od =
+          new api.SetAccountInfoResponseProviderUserInfo.fromJson(o.toJson());
       checkSetAccountInfoResponseProviderUserInfo(od);
     });
   });
 
-
   unittest.group("obj-schema-SetAccountInfoResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetAccountInfoResponse();
@@ -1766,7 +1974,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SignupNewUserResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSignupNewUserResponse();
@@ -1775,7 +1982,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UploadAccountResponseError", () {
     unittest.test("to-json--from-json", () {
       var o = buildUploadAccountResponseError();
@@ -1784,7 +1990,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UploadAccountResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUploadAccountResponse();
@@ -1793,7 +1998,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserInfoProviderUserInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserInfoProviderUserInfo();
@@ -1802,7 +2006,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserInfo();
@@ -1811,7 +2014,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VerifyAssertionResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVerifyAssertionResponse();
@@ -1820,7 +2022,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VerifyCustomTokenResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVerifyCustomTokenResponse();
@@ -1829,7 +2030,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VerifyPasswordResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVerifyPasswordResponse();
@@ -1838,26 +2038,30 @@
     });
   });
 
-
   unittest.group("resource-RelyingpartyResourceApi", () {
     unittest.test("method--createAuthUri", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartyCreateAuthUriRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("createAuthUri"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("createAuthUri"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1870,43 +2074,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCreateAuthUriResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.createAuthUri(arg_request).then(unittest.expectAsync1(((api.CreateAuthUriResponse response) {
+      res
+          .createAuthUri(arg_request)
+          .then(unittest.expectAsync1(((api.CreateAuthUriResponse response) {
         checkCreateAuthUriResponse(response);
       })));
     });
 
     unittest.test("method--deleteAccount", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartyDeleteAccountRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyDeleteAccountRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("deleteAccount"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("deleteAccount"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1919,43 +2131,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDeleteAccountResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.deleteAccount(arg_request).then(unittest.expectAsync1(((api.DeleteAccountResponse response) {
+      res
+          .deleteAccount(arg_request)
+          .then(unittest.expectAsync1(((api.DeleteAccountResponse response) {
         checkDeleteAccountResponse(response);
       })));
     });
 
     unittest.test("method--downloadAccount", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
-      var arg_request = buildIdentitytoolkitRelyingpartyDownloadAccountRequest();
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
+      var arg_request =
+          buildIdentitytoolkitRelyingpartyDownloadAccountRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyDownloadAccountRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("downloadAccount"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("downloadAccount"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -1968,43 +2189,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDownloadAccountResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.downloadAccount(arg_request).then(unittest.expectAsync1(((api.DownloadAccountResponse response) {
+      res
+          .downloadAccount(arg_request)
+          .then(unittest.expectAsync1(((api.DownloadAccountResponse response) {
         checkDownloadAccountResponse(response);
       })));
     });
 
     unittest.test("method--getAccountInfo", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartyGetAccountInfoRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("getAccountInfo"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("getAccountInfo"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -2017,29 +2246,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetAccountInfoResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getAccountInfo(arg_request).then(unittest.expectAsync1(((api.GetAccountInfoResponse response) {
+      res
+          .getAccountInfo(arg_request)
+          .then(unittest.expectAsync1(((api.GetAccountInfoResponse response) {
         checkGetAccountInfoResponse(response);
       })));
     });
 
     unittest.test("method--getOobConfirmationCode", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildRelyingparty();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.Relyingparty.fromJson(json);
@@ -2049,11 +2281,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("getOobConfirmationCode"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("getOobConfirmationCode"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -2066,29 +2301,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetOobConfirmationCodeResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getOobConfirmationCode(arg_request).then(unittest.expectAsync1(((api.GetOobConfirmationCodeResponse response) {
+      res.getOobConfirmationCode(arg_request).then(
+          unittest.expectAsync1(((api.GetOobConfirmationCodeResponse response) {
         checkGetOobConfirmationCodeResponse(response);
       })));
     });
 
     unittest.test("method--getProjectConfig", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_delegatedProjectNumber = "foo";
       var arg_projectNumber = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2096,11 +2333,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("getProjectConfig"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("getProjectConfig"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -2113,41 +2353,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["delegatedProjectNumber"].first, unittest.equals(arg_delegatedProjectNumber));
-        unittest.expect(queryMap["projectNumber"].first, unittest.equals(arg_projectNumber));
-
+        unittest.expect(queryMap["delegatedProjectNumber"].first,
+            unittest.equals(arg_delegatedProjectNumber));
+        unittest.expect(queryMap["projectNumber"].first,
+            unittest.equals(arg_projectNumber));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildIdentitytoolkitRelyingpartyGetProjectConfigResponse());
+        var resp = convert.JSON
+            .encode(buildIdentitytoolkitRelyingpartyGetProjectConfigResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getProjectConfig(delegatedProjectNumber: arg_delegatedProjectNumber, projectNumber: arg_projectNumber).then(unittest.expectAsync1(((api.IdentitytoolkitRelyingpartyGetProjectConfigResponse response) {
+      res
+          .getProjectConfig(
+              delegatedProjectNumber: arg_delegatedProjectNumber,
+              projectNumber: arg_projectNumber)
+          .then(unittest.expectAsync1(
+              ((api.IdentitytoolkitRelyingpartyGetProjectConfigResponse
+                  response) {
         checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(response);
       })));
     });
 
     unittest.test("method--getPublicKeys", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("publicKeys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("publicKeys"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2160,39 +2413,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildIdentitytoolkitRelyingpartyGetPublicKeysResponse());
+        var resp = convert.JSON
+            .encode(buildIdentitytoolkitRelyingpartyGetPublicKeysResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getPublicKeys().then(unittest.expectAsync1(((api.IdentitytoolkitRelyingpartyGetPublicKeysResponse response) {
+      res.getPublicKeys().then(unittest.expectAsync1(
+          ((api.IdentitytoolkitRelyingpartyGetPublicKeysResponse response) {
         checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(response);
       })));
     });
 
     unittest.test("method--getRecaptchaParam", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("getRecaptchaParam"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("getRecaptchaParam"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -2205,43 +2464,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetRecaptchaParamResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getRecaptchaParam().then(unittest.expectAsync1(((api.GetRecaptchaParamResponse response) {
+      res.getRecaptchaParam().then(
+          unittest.expectAsync1(((api.GetRecaptchaParamResponse response) {
         checkGetRecaptchaParamResponse(response);
       })));
     });
 
     unittest.test("method--resetPassword", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartyResetPasswordRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyResetPasswordRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("resetPassword"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("resetPassword"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -2254,43 +2520,110 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResetPasswordResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resetPassword(arg_request).then(unittest.expectAsync1(((api.ResetPasswordResponse response) {
+      res
+          .resetPassword(arg_request)
+          .then(unittest.expectAsync1(((api.ResetPasswordResponse response) {
         checkResetPasswordResponse(response);
       })));
     });
 
-    unittest.test("method--setAccountInfo", () {
-
+    unittest.test("method--sendVerificationCode", () {
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
+      var arg_request =
+          buildIdentitytoolkitRelyingpartySendVerificationCodeRequest();
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api
+                .IdentitytoolkitRelyingpartySendVerificationCodeRequest.fromJson(
+            json);
+        checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("sendVerificationCode"));
+        pathOffset += 20;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(
+            buildIdentitytoolkitRelyingpartySendVerificationCodeResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.sendVerificationCode(arg_request).then(unittest.expectAsync1(
+          ((api.IdentitytoolkitRelyingpartySendVerificationCodeResponse
+              response) {
+        checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(response);
+      })));
+    });
+
+    unittest.test("method--setAccountInfo", () {
+      var mock = new HttpServerMock();
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartySetAccountInfoRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartySetAccountInfoRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("setAccountInfo"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("setAccountInfo"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -2303,43 +2636,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSetAccountInfoResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setAccountInfo(arg_request).then(unittest.expectAsync1(((api.SetAccountInfoResponse response) {
+      res
+          .setAccountInfo(arg_request)
+          .then(unittest.expectAsync1(((api.SetAccountInfoResponse response) {
         checkSetAccountInfoResponse(response);
       })));
     });
 
     unittest.test("method--setProjectConfig", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
-      var arg_request = buildIdentitytoolkitRelyingpartySetProjectConfigRequest();
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
+      var arg_request =
+          buildIdentitytoolkitRelyingpartySetProjectConfigRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartySetProjectConfigRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("setProjectConfig"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("setProjectConfig"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -2352,43 +2694,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildIdentitytoolkitRelyingpartySetProjectConfigResponse());
+        var resp = convert.JSON
+            .encode(buildIdentitytoolkitRelyingpartySetProjectConfigResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setProjectConfig(arg_request).then(unittest.expectAsync1(((api.IdentitytoolkitRelyingpartySetProjectConfigResponse response) {
+      res.setProjectConfig(arg_request).then(unittest.expectAsync1(
+          ((api.IdentitytoolkitRelyingpartySetProjectConfigResponse response) {
         checkIdentitytoolkitRelyingpartySetProjectConfigResponse(response);
       })));
     });
 
     unittest.test("method--signOutUser", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartySignOutUserRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartySignOutUserRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("signOutUser"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("signOutUser"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -2401,43 +2751,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildIdentitytoolkitRelyingpartySignOutUserResponse());
+        var resp = convert.JSON
+            .encode(buildIdentitytoolkitRelyingpartySignOutUserResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.signOutUser(arg_request).then(unittest.expectAsync1(((api.IdentitytoolkitRelyingpartySignOutUserResponse response) {
+      res.signOutUser(arg_request).then(unittest.expectAsync1(
+          ((api.IdentitytoolkitRelyingpartySignOutUserResponse response) {
         checkIdentitytoolkitRelyingpartySignOutUserResponse(response);
       })));
     });
 
     unittest.test("method--signupNewUser", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartySignupNewUserRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartySignupNewUserRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("signupNewUser"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("signupNewUser"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -2450,43 +2808,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSignupNewUserResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.signupNewUser(arg_request).then(unittest.expectAsync1(((api.SignupNewUserResponse response) {
+      res
+          .signupNewUser(arg_request)
+          .then(unittest.expectAsync1(((api.SignupNewUserResponse response) {
         checkSignupNewUserResponse(response);
       })));
     });
 
     unittest.test("method--uploadAccount", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartyUploadAccountRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyUploadAccountRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("uploadAccount"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("uploadAccount"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -2499,43 +2865,52 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUploadAccountResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.uploadAccount(arg_request).then(unittest.expectAsync1(((api.UploadAccountResponse response) {
+      res
+          .uploadAccount(arg_request)
+          .then(unittest.expectAsync1(((api.UploadAccountResponse response) {
         checkUploadAccountResponse(response);
       })));
     });
 
     unittest.test("method--verifyAssertion", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
-      var arg_request = buildIdentitytoolkitRelyingpartyVerifyAssertionRequest();
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
+      var arg_request =
+          buildIdentitytoolkitRelyingpartyVerifyAssertionRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("verifyAssertion"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("verifyAssertion"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -2548,43 +2923,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVerifyAssertionResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.verifyAssertion(arg_request).then(unittest.expectAsync1(((api.VerifyAssertionResponse response) {
+      res
+          .verifyAssertion(arg_request)
+          .then(unittest.expectAsync1(((api.VerifyAssertionResponse response) {
         checkVerifyAssertionResponse(response);
       })));
     });
 
     unittest.test("method--verifyCustomToken", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
-      var arg_request = buildIdentitytoolkitRelyingpartyVerifyCustomTokenRequest();
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
+      var arg_request =
+          buildIdentitytoolkitRelyingpartyVerifyCustomTokenRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(json);
+        var obj = new api
+            .IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(json);
         checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("verifyCustomToken"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("verifyCustomToken"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -2597,43 +2980,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVerifyCustomTokenResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.verifyCustomToken(arg_request).then(unittest.expectAsync1(((api.VerifyCustomTokenResponse response) {
+      res.verifyCustomToken(arg_request).then(
+          unittest.expectAsync1(((api.VerifyCustomTokenResponse response) {
         checkVerifyCustomTokenResponse(response);
       })));
     });
 
     unittest.test("method--verifyPassword", () {
-
       var mock = new HttpServerMock();
-      api.RelyingpartyResourceApi res = new api.IdentitytoolkitApi(mock).relyingparty;
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
       var arg_request = buildIdentitytoolkitRelyingpartyVerifyPasswordRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(json);
+        var obj =
+            new api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(
+                json);
         checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
         pathOffset += 32;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("verifyPassword"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("verifyPassword"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -2646,27 +3036,83 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVerifyPasswordResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.verifyPassword(arg_request).then(unittest.expectAsync1(((api.VerifyPasswordResponse response) {
+      res
+          .verifyPassword(arg_request)
+          .then(unittest.expectAsync1(((api.VerifyPasswordResponse response) {
         checkVerifyPasswordResponse(response);
       })));
     });
 
+    unittest.test("method--verifyPhoneNumber", () {
+      var mock = new HttpServerMock();
+      api.RelyingpartyResourceApi res =
+          new api.IdentitytoolkitApi(mock).relyingparty;
+      var arg_request =
+          buildIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest();
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api
+            .IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest.fromJson(json);
+        checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("verifyPhoneNumber"));
+        pathOffset += 17;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(
+            buildIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.verifyPhoneNumber(arg_request).then(unittest.expectAsync1(
+          ((api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse response) {
+        checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(response);
+      })));
+    });
   });
-
-
 }
-
diff --git a/generated/googleapis/test/language/v1_test.dart b/generated/googleapis/test/language/v1_test.dart
index 7e226bb..54c616c 100644
--- a/generated/googleapis/test/language/v1_test.dart
+++ b/generated/googleapis/test/language/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.language.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/language/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -72,14 +71,14 @@
   buildCounterAnalyzeEntitiesRequest--;
 }
 
-buildUnnamed872() {
+buildUnnamed875() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed872(core.List<api.Entity> o) {
+checkUnnamed875(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -90,7 +89,7 @@
   var o = new api.AnalyzeEntitiesResponse();
   buildCounterAnalyzeEntitiesResponse++;
   if (buildCounterAnalyzeEntitiesResponse < 3) {
-    o.entities = buildUnnamed872();
+    o.entities = buildUnnamed875();
     o.language = "foo";
   }
   buildCounterAnalyzeEntitiesResponse--;
@@ -100,7 +99,7 @@
 checkAnalyzeEntitiesResponse(api.AnalyzeEntitiesResponse o) {
   buildCounterAnalyzeEntitiesResponse++;
   if (buildCounterAnalyzeEntitiesResponse < 3) {
-    checkUnnamed872(o.entities);
+    checkUnnamed875(o.entities);
     unittest.expect(o.language, unittest.equals('foo'));
   }
   buildCounterAnalyzeEntitiesResponse--;
@@ -127,14 +126,14 @@
   buildCounterAnalyzeSentimentRequest--;
 }
 
-buildUnnamed873() {
+buildUnnamed876() {
   var o = new core.List<api.Sentence>();
   o.add(buildSentence());
   o.add(buildSentence());
   return o;
 }
 
-checkUnnamed873(core.List<api.Sentence> o) {
+checkUnnamed876(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSentence(o[0]);
   checkSentence(o[1]);
@@ -147,7 +146,7 @@
   if (buildCounterAnalyzeSentimentResponse < 3) {
     o.documentSentiment = buildSentiment();
     o.language = "foo";
-    o.sentences = buildUnnamed873();
+    o.sentences = buildUnnamed876();
   }
   buildCounterAnalyzeSentimentResponse--;
   return o;
@@ -158,7 +157,7 @@
   if (buildCounterAnalyzeSentimentResponse < 3) {
     checkSentiment(o.documentSentiment);
     unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed873(o.sentences);
+    checkUnnamed876(o.sentences);
   }
   buildCounterAnalyzeSentimentResponse--;
 }
@@ -184,91 +183,6 @@
   buildCounterAnalyzeSyntaxRequest--;
 }
 
-buildUnnamed874() {
-  var o = new core.List<api.Sentence>();
-  o.add(buildSentence());
-  o.add(buildSentence());
-  return o;
-}
-
-checkUnnamed874(core.List<api.Sentence> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSentence(o[0]);
-  checkSentence(o[1]);
-}
-
-buildUnnamed875() {
-  var o = new core.List<api.Token>();
-  o.add(buildToken());
-  o.add(buildToken());
-  return o;
-}
-
-checkUnnamed875(core.List<api.Token> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkToken(o[0]);
-  checkToken(o[1]);
-}
-
-core.int buildCounterAnalyzeSyntaxResponse = 0;
-buildAnalyzeSyntaxResponse() {
-  var o = new api.AnalyzeSyntaxResponse();
-  buildCounterAnalyzeSyntaxResponse++;
-  if (buildCounterAnalyzeSyntaxResponse < 3) {
-    o.language = "foo";
-    o.sentences = buildUnnamed874();
-    o.tokens = buildUnnamed875();
-  }
-  buildCounterAnalyzeSyntaxResponse--;
-  return o;
-}
-
-checkAnalyzeSyntaxResponse(api.AnalyzeSyntaxResponse o) {
-  buildCounterAnalyzeSyntaxResponse++;
-  if (buildCounterAnalyzeSyntaxResponse < 3) {
-    unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed874(o.sentences);
-    checkUnnamed875(o.tokens);
-  }
-  buildCounterAnalyzeSyntaxResponse--;
-}
-
-core.int buildCounterAnnotateTextRequest = 0;
-buildAnnotateTextRequest() {
-  var o = new api.AnnotateTextRequest();
-  buildCounterAnnotateTextRequest++;
-  if (buildCounterAnnotateTextRequest < 3) {
-    o.document = buildDocument();
-    o.encodingType = "foo";
-    o.features = buildFeatures();
-  }
-  buildCounterAnnotateTextRequest--;
-  return o;
-}
-
-checkAnnotateTextRequest(api.AnnotateTextRequest o) {
-  buildCounterAnnotateTextRequest++;
-  if (buildCounterAnnotateTextRequest < 3) {
-    checkDocument(o.document);
-    unittest.expect(o.encodingType, unittest.equals('foo'));
-    checkFeatures(o.features);
-  }
-  buildCounterAnnotateTextRequest--;
-}
-
-buildUnnamed876() {
-  var o = new core.List<api.Entity>();
-  o.add(buildEntity());
-  o.add(buildEntity());
-  return o;
-}
-
-checkUnnamed876(core.List<api.Entity> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkEntity(o[0]);
-  checkEntity(o[1]);
-}
-
 buildUnnamed877() {
   var o = new core.List<api.Sentence>();
   o.add(buildSentence());
@@ -295,16 +209,101 @@
   checkToken(o[1]);
 }
 
+core.int buildCounterAnalyzeSyntaxResponse = 0;
+buildAnalyzeSyntaxResponse() {
+  var o = new api.AnalyzeSyntaxResponse();
+  buildCounterAnalyzeSyntaxResponse++;
+  if (buildCounterAnalyzeSyntaxResponse < 3) {
+    o.language = "foo";
+    o.sentences = buildUnnamed877();
+    o.tokens = buildUnnamed878();
+  }
+  buildCounterAnalyzeSyntaxResponse--;
+  return o;
+}
+
+checkAnalyzeSyntaxResponse(api.AnalyzeSyntaxResponse o) {
+  buildCounterAnalyzeSyntaxResponse++;
+  if (buildCounterAnalyzeSyntaxResponse < 3) {
+    unittest.expect(o.language, unittest.equals('foo'));
+    checkUnnamed877(o.sentences);
+    checkUnnamed878(o.tokens);
+  }
+  buildCounterAnalyzeSyntaxResponse--;
+}
+
+core.int buildCounterAnnotateTextRequest = 0;
+buildAnnotateTextRequest() {
+  var o = new api.AnnotateTextRequest();
+  buildCounterAnnotateTextRequest++;
+  if (buildCounterAnnotateTextRequest < 3) {
+    o.document = buildDocument();
+    o.encodingType = "foo";
+    o.features = buildFeatures();
+  }
+  buildCounterAnnotateTextRequest--;
+  return o;
+}
+
+checkAnnotateTextRequest(api.AnnotateTextRequest o) {
+  buildCounterAnnotateTextRequest++;
+  if (buildCounterAnnotateTextRequest < 3) {
+    checkDocument(o.document);
+    unittest.expect(o.encodingType, unittest.equals('foo'));
+    checkFeatures(o.features);
+  }
+  buildCounterAnnotateTextRequest--;
+}
+
+buildUnnamed879() {
+  var o = new core.List<api.Entity>();
+  o.add(buildEntity());
+  o.add(buildEntity());
+  return o;
+}
+
+checkUnnamed879(core.List<api.Entity> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkEntity(o[0]);
+  checkEntity(o[1]);
+}
+
+buildUnnamed880() {
+  var o = new core.List<api.Sentence>();
+  o.add(buildSentence());
+  o.add(buildSentence());
+  return o;
+}
+
+checkUnnamed880(core.List<api.Sentence> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSentence(o[0]);
+  checkSentence(o[1]);
+}
+
+buildUnnamed881() {
+  var o = new core.List<api.Token>();
+  o.add(buildToken());
+  o.add(buildToken());
+  return o;
+}
+
+checkUnnamed881(core.List<api.Token> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkToken(o[0]);
+  checkToken(o[1]);
+}
+
 core.int buildCounterAnnotateTextResponse = 0;
 buildAnnotateTextResponse() {
   var o = new api.AnnotateTextResponse();
   buildCounterAnnotateTextResponse++;
   if (buildCounterAnnotateTextResponse < 3) {
     o.documentSentiment = buildSentiment();
-    o.entities = buildUnnamed876();
+    o.entities = buildUnnamed879();
     o.language = "foo";
-    o.sentences = buildUnnamed877();
-    o.tokens = buildUnnamed878();
+    o.sentences = buildUnnamed880();
+    o.tokens = buildUnnamed881();
   }
   buildCounterAnnotateTextResponse--;
   return o;
@@ -314,10 +313,10 @@
   buildCounterAnnotateTextResponse++;
   if (buildCounterAnnotateTextResponse < 3) {
     checkSentiment(o.documentSentiment);
-    checkUnnamed876(o.entities);
+    checkUnnamed879(o.entities);
     unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed877(o.sentences);
-    checkUnnamed878(o.tokens);
+    checkUnnamed880(o.sentences);
+    checkUnnamed881(o.tokens);
   }
   buildCounterAnnotateTextResponse--;
 }
@@ -368,27 +367,27 @@
   buildCounterDocument--;
 }
 
-buildUnnamed879() {
+buildUnnamed882() {
   var o = new core.List<api.EntityMention>();
   o.add(buildEntityMention());
   o.add(buildEntityMention());
   return o;
 }
 
-checkUnnamed879(core.List<api.EntityMention> o) {
+checkUnnamed882(core.List<api.EntityMention> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityMention(o[0]);
   checkEntityMention(o[1]);
 }
 
-buildUnnamed880() {
+buildUnnamed883() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed880(core.Map<core.String, core.String> o) {
+checkUnnamed883(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -399,8 +398,8 @@
   var o = new api.Entity();
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
-    o.mentions = buildUnnamed879();
-    o.metadata = buildUnnamed880();
+    o.mentions = buildUnnamed882();
+    o.metadata = buildUnnamed883();
     o.name = "foo";
     o.salience = 42.0;
     o.type = "foo";
@@ -412,8 +411,8 @@
 checkEntity(api.Entity o) {
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
-    checkUnnamed879(o.mentions);
-    checkUnnamed880(o.metadata);
+    checkUnnamed882(o.mentions);
+    checkUnnamed883(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.salience, unittest.equals(42.0));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -548,30 +547,46 @@
   buildCounterSentiment--;
 }
 
-buildUnnamed881() {
+buildUnnamed884() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed881(core.Map<core.String, core.Object> o) {
+checkUnnamed884(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed882() {
+buildUnnamed885() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed881());
-  o.add(buildUnnamed881());
+  o.add(buildUnnamed884());
+  o.add(buildUnnamed884());
   return o;
 }
 
-checkUnnamed882(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed885(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed881(o[0]);
-  checkUnnamed881(o[1]);
+  checkUnnamed884(o[0]);
+  checkUnnamed884(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -580,7 +595,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed882();
+    o.details = buildUnnamed885();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -591,7 +606,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed882(o.details);
+    checkUnnamed885(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -643,7 +658,6 @@
   buildCounterToken--;
 }
 
-
 main() {
   unittest.group("obj-schema-AnalyzeEntitiesRequest", () {
     unittest.test("to-json--from-json", () {
@@ -653,7 +667,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeEntitiesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeEntitiesResponse();
@@ -662,7 +675,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeSentimentRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeSentimentRequest();
@@ -671,7 +683,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeSentimentResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeSentimentResponse();
@@ -680,7 +691,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeSyntaxRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeSyntaxRequest();
@@ -689,7 +699,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeSyntaxResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeSyntaxResponse();
@@ -698,7 +707,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnnotateTextRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnnotateTextRequest();
@@ -707,7 +715,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnnotateTextResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnnotateTextResponse();
@@ -716,7 +723,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DependencyEdge", () {
     unittest.test("to-json--from-json", () {
       var o = buildDependencyEdge();
@@ -725,7 +731,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Document", () {
     unittest.test("to-json--from-json", () {
       var o = buildDocument();
@@ -734,7 +739,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Entity", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntity();
@@ -743,7 +747,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityMention", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityMention();
@@ -752,7 +755,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Features", () {
     unittest.test("to-json--from-json", () {
       var o = buildFeatures();
@@ -761,7 +763,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PartOfSpeech", () {
     unittest.test("to-json--from-json", () {
       var o = buildPartOfSpeech();
@@ -770,7 +771,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Sentence", () {
     unittest.test("to-json--from-json", () {
       var o = buildSentence();
@@ -779,7 +779,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Sentiment", () {
     unittest.test("to-json--from-json", () {
       var o = buildSentiment();
@@ -788,7 +787,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -797,7 +795,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextSpan", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextSpan();
@@ -806,7 +803,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Token", () {
     unittest.test("to-json--from-json", () {
       var o = buildToken();
@@ -815,10 +811,8 @@
     });
   });
 
-
   unittest.group("resource-DocumentsResourceApi", () {
     unittest.test("method--analyzeEntities", () {
-
       var mock = new HttpServerMock();
       api.DocumentsResourceApi res = new api.LanguageApi(mock).documents;
       var arg_request = buildAnalyzeEntitiesRequest();
@@ -830,9 +824,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("v1/documents:analyzeEntities"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 28),
+            unittest.equals("v1/documents:analyzeEntities"));
         pathOffset += 28;
 
         var query = (req.url).query;
@@ -845,27 +841,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnalyzeEntitiesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.analyzeEntities(arg_request).then(unittest.expectAsync1(((api.AnalyzeEntitiesResponse response) {
+      res
+          .analyzeEntities(arg_request)
+          .then(unittest.expectAsync1(((api.AnalyzeEntitiesResponse response) {
         checkAnalyzeEntitiesResponse(response);
       })));
     });
 
     unittest.test("method--analyzeSentiment", () {
-
       var mock = new HttpServerMock();
       api.DocumentsResourceApi res = new api.LanguageApi(mock).documents;
       var arg_request = buildAnalyzeSentimentRequest();
@@ -877,9 +875,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 29), unittest.equals("v1/documents:analyzeSentiment"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 29),
+            unittest.equals("v1/documents:analyzeSentiment"));
         pathOffset += 29;
 
         var query = (req.url).query;
@@ -892,27 +892,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnalyzeSentimentResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.analyzeSentiment(arg_request).then(unittest.expectAsync1(((api.AnalyzeSentimentResponse response) {
+      res
+          .analyzeSentiment(arg_request)
+          .then(unittest.expectAsync1(((api.AnalyzeSentimentResponse response) {
         checkAnalyzeSentimentResponse(response);
       })));
     });
 
     unittest.test("method--analyzeSyntax", () {
-
       var mock = new HttpServerMock();
       api.DocumentsResourceApi res = new api.LanguageApi(mock).documents;
       var arg_request = buildAnalyzeSyntaxRequest();
@@ -924,9 +926,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("v1/documents:analyzeSyntax"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("v1/documents:analyzeSyntax"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -939,27 +943,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnalyzeSyntaxResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.analyzeSyntax(arg_request).then(unittest.expectAsync1(((api.AnalyzeSyntaxResponse response) {
+      res
+          .analyzeSyntax(arg_request)
+          .then(unittest.expectAsync1(((api.AnalyzeSyntaxResponse response) {
         checkAnalyzeSyntaxResponse(response);
       })));
     });
 
     unittest.test("method--annotateText", () {
-
       var mock = new HttpServerMock();
       api.DocumentsResourceApi res = new api.LanguageApi(mock).documents;
       var arg_request = buildAnnotateTextRequest();
@@ -971,9 +977,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("v1/documents:annotateText"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("v1/documents:annotateText"));
         pathOffset += 25;
 
         var query = (req.url).query;
@@ -986,27 +994,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnnotateTextResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.annotateText(arg_request).then(unittest.expectAsync1(((api.AnnotateTextResponse response) {
+      res
+          .annotateText(arg_request)
+          .then(unittest.expectAsync1(((api.AnnotateTextResponse response) {
         checkAnnotateTextResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index 07155ae..80ef688 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.licensing.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/licensing/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -103,14 +102,14 @@
   buildCounterLicenseAssignmentInsert--;
 }
 
-buildUnnamed2104() {
+buildUnnamed2102() {
   var o = new core.List<api.LicenseAssignment>();
   o.add(buildLicenseAssignment());
   o.add(buildLicenseAssignment());
   return o;
 }
 
-checkUnnamed2104(core.List<api.LicenseAssignment> o) {
+checkUnnamed2102(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLicenseAssignment(o[0]);
   checkLicenseAssignment(o[1]);
@@ -122,7 +121,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2104();
+    o.items = buildUnnamed2102();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -134,14 +133,13 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2104(o.items);
+    checkUnnamed2102(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterLicenseAssignmentList--;
 }
 
-
 main() {
   unittest.group("obj-schema-LicenseAssignment", () {
     unittest.test("to-json--from-json", () {
@@ -151,7 +149,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LicenseAssignmentInsert", () {
     unittest.test("to-json--from-json", () {
       var o = buildLicenseAssignmentInsert();
@@ -160,7 +157,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LicenseAssignmentList", () {
     unittest.test("to-json--from-json", () {
       var o = buildLicenseAssignmentList();
@@ -169,12 +165,11 @@
     });
   });
 
-
   unittest.group("resource-LicenseAssignmentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_productId = "foo";
       var arg_skuId = "foo";
       var arg_userId = "foo";
@@ -183,7 +178,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -196,27 +192,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_productId, arg_skuId, arg_userId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_productId, arg_skuId, arg_userId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_productId = "foo";
       var arg_skuId = "foo";
       var arg_userId = "foo";
@@ -225,7 +224,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -238,29 +238,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicenseAssignment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_productId, arg_skuId, arg_userId).then(unittest.expectAsync1(((api.LicenseAssignment response) {
+      res
+          .get(arg_productId, arg_skuId, arg_userId)
+          .then(unittest.expectAsync1(((api.LicenseAssignment response) {
         checkLicenseAssignment(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_request = buildLicenseAssignmentInsert();
       var arg_productId = "foo";
       var arg_skuId = "foo";
@@ -272,7 +275,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -285,29 +289,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicenseAssignment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_productId, arg_skuId).then(unittest.expectAsync1(((api.LicenseAssignment response) {
+      res
+          .insert(arg_request, arg_productId, arg_skuId)
+          .then(unittest.expectAsync1(((api.LicenseAssignment response) {
         checkLicenseAssignment(response);
       })));
     });
 
     unittest.test("method--listForProduct", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_productId = "foo";
       var arg_customerId = "foo";
       var arg_maxResults = 42;
@@ -317,7 +324,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -330,32 +338,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicenseAssignmentList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listForProduct(arg_productId, arg_customerId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LicenseAssignmentList response) {
+      res
+          .listForProduct(arg_productId, arg_customerId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.LicenseAssignmentList response) {
         checkLicenseAssignmentList(response);
       })));
     });
 
     unittest.test("method--listForProductAndSku", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_productId = "foo";
       var arg_skuId = "foo";
       var arg_customerId = "foo";
@@ -366,7 +381,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -379,32 +395,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicenseAssignmentList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listForProductAndSku(arg_productId, arg_skuId, arg_customerId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LicenseAssignmentList response) {
+      res
+          .listForProductAndSku(arg_productId, arg_skuId, arg_customerId,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.LicenseAssignmentList response) {
         checkLicenseAssignmentList(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_request = buildLicenseAssignment();
       var arg_productId = "foo";
       var arg_skuId = "foo";
@@ -417,7 +440,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -430,29 +454,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicenseAssignment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_productId, arg_skuId, arg_userId).then(unittest.expectAsync1(((api.LicenseAssignment response) {
+      res
+          .patch(arg_request, arg_productId, arg_skuId, arg_userId)
+          .then(unittest.expectAsync1(((api.LicenseAssignment response) {
         checkLicenseAssignment(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.LicenseAssignmentsResourceApi res = new api.LicensingApi(mock).licenseAssignments;
+      api.LicenseAssignmentsResourceApi res =
+          new api.LicensingApi(mock).licenseAssignments;
       var arg_request = buildLicenseAssignment();
       var arg_productId = "foo";
       var arg_skuId = "foo";
@@ -465,7 +492,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -478,27 +506,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLicenseAssignment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_productId, arg_skuId, arg_userId).then(unittest.expectAsync1(((api.LicenseAssignment response) {
+      res
+          .update(arg_request, arg_productId, arg_skuId, arg_userId)
+          .then(unittest.expectAsync1(((api.LicenseAssignment response) {
         checkLicenseAssignment(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/logging/v2_test.dart b/generated/googleapis/test/logging/v2_test.dart
index 603c27c..a16843c 100644
--- a/generated/googleapis/test/logging/v2_test.dart
+++ b/generated/googleapis/test/logging/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.logging.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/logging/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,29 +44,105 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
+core.int buildCounterBucketOptions = 0;
+buildBucketOptions() {
+  var o = new api.BucketOptions();
+  buildCounterBucketOptions++;
+  if (buildCounterBucketOptions < 3) {
+    o.explicitBuckets = buildExplicit();
+    o.exponentialBuckets = buildExponential();
+    o.linearBuckets = buildLinear();
+  }
+  buildCounterBucketOptions--;
+  return o;
+}
+
+checkBucketOptions(api.BucketOptions o) {
+  buildCounterBucketOptions++;
+  if (buildCounterBucketOptions < 3) {
+    checkExplicit(o.explicitBuckets);
+    checkExponential(o.exponentialBuckets);
+    checkLinear(o.linearBuckets);
+  }
+  buildCounterBucketOptions--;
+}
+
 core.int buildCounterEmpty = 0;
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
+buildUnnamed250() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed250(core.List<core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals(42.0));
+  unittest.expect(o[1], unittest.equals(42.0));
+}
+
+core.int buildCounterExplicit = 0;
+buildExplicit() {
+  var o = new api.Explicit();
+  buildCounterExplicit++;
+  if (buildCounterExplicit < 3) {
+    o.bounds = buildUnnamed250();
+  }
+  buildCounterExplicit--;
+  return o;
+}
+
+checkExplicit(api.Explicit o) {
+  buildCounterExplicit++;
+  if (buildCounterExplicit < 3) {
+    checkUnnamed250(o.bounds);
+  }
+  buildCounterExplicit--;
+}
+
+core.int buildCounterExponential = 0;
+buildExponential() {
+  var o = new api.Exponential();
+  buildCounterExponential++;
+  if (buildCounterExponential < 3) {
+    o.growthFactor = 42.0;
+    o.numFiniteBuckets = 42;
+    o.scale = 42.0;
+  }
+  buildCounterExponential--;
+  return o;
+}
+
+checkExponential(api.Exponential o) {
+  buildCounterExponential++;
+  if (buildCounterExponential < 3) {
+    unittest.expect(o.growthFactor, unittest.equals(42.0));
+    unittest.expect(o.numFiniteBuckets, unittest.equals(42));
+    unittest.expect(o.scale, unittest.equals(42.0));
+  }
+  buildCounterExponential--;
+}
+
 core.int buildCounterHttpRequest = 0;
 buildHttpRequest() {
   var o = new api.HttpRequest();
@@ -138,19 +213,186 @@
   buildCounterLabelDescriptor--;
 }
 
-buildUnnamed255() {
+core.int buildCounterLinear = 0;
+buildLinear() {
+  var o = new api.Linear();
+  buildCounterLinear++;
+  if (buildCounterLinear < 3) {
+    o.numFiniteBuckets = 42;
+    o.offset = 42.0;
+    o.width = 42.0;
+  }
+  buildCounterLinear--;
+  return o;
+}
+
+checkLinear(api.Linear o) {
+  buildCounterLinear++;
+  if (buildCounterLinear < 3) {
+    unittest.expect(o.numFiniteBuckets, unittest.equals(42));
+    unittest.expect(o.offset, unittest.equals(42.0));
+    unittest.expect(o.width, unittest.equals(42.0));
+  }
+  buildCounterLinear--;
+}
+
+buildUnnamed251() {
+  var o = new core.List<api.LogExclusion>();
+  o.add(buildLogExclusion());
+  o.add(buildLogExclusion());
+  return o;
+}
+
+checkUnnamed251(core.List<api.LogExclusion> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkLogExclusion(o[0]);
+  checkLogExclusion(o[1]);
+}
+
+core.int buildCounterListExclusionsResponse = 0;
+buildListExclusionsResponse() {
+  var o = new api.ListExclusionsResponse();
+  buildCounterListExclusionsResponse++;
+  if (buildCounterListExclusionsResponse < 3) {
+    o.exclusions = buildUnnamed251();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListExclusionsResponse--;
+  return o;
+}
+
+checkListExclusionsResponse(api.ListExclusionsResponse o) {
+  buildCounterListExclusionsResponse++;
+  if (buildCounterListExclusionsResponse < 3) {
+    checkUnnamed251(o.exclusions);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListExclusionsResponse--;
+}
+
+buildUnnamed252() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed255(core.List<core.String> o) {
+checkUnnamed252(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed253() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed253(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterListLogEntriesRequest = 0;
+buildListLogEntriesRequest() {
+  var o = new api.ListLogEntriesRequest();
+  buildCounterListLogEntriesRequest++;
+  if (buildCounterListLogEntriesRequest < 3) {
+    o.filter = "foo";
+    o.orderBy = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.projectIds = buildUnnamed252();
+    o.resourceNames = buildUnnamed253();
+  }
+  buildCounterListLogEntriesRequest--;
+  return o;
+}
+
+checkListLogEntriesRequest(api.ListLogEntriesRequest o) {
+  buildCounterListLogEntriesRequest++;
+  if (buildCounterListLogEntriesRequest < 3) {
+    unittest.expect(o.filter, unittest.equals('foo'));
+    unittest.expect(o.orderBy, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    checkUnnamed252(o.projectIds);
+    checkUnnamed253(o.resourceNames);
+  }
+  buildCounterListLogEntriesRequest--;
+}
+
+buildUnnamed254() {
+  var o = new core.List<api.LogEntry>();
+  o.add(buildLogEntry());
+  o.add(buildLogEntry());
+  return o;
+}
+
+checkUnnamed254(core.List<api.LogEntry> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkLogEntry(o[0]);
+  checkLogEntry(o[1]);
+}
+
+core.int buildCounterListLogEntriesResponse = 0;
+buildListLogEntriesResponse() {
+  var o = new api.ListLogEntriesResponse();
+  buildCounterListLogEntriesResponse++;
+  if (buildCounterListLogEntriesResponse < 3) {
+    o.entries = buildUnnamed254();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListLogEntriesResponse--;
+  return o;
+}
+
+checkListLogEntriesResponse(api.ListLogEntriesResponse o) {
+  buildCounterListLogEntriesResponse++;
+  if (buildCounterListLogEntriesResponse < 3) {
+    checkUnnamed254(o.entries);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListLogEntriesResponse--;
+}
+
+buildUnnamed255() {
+  var o = new core.List<api.LogMetric>();
+  o.add(buildLogMetric());
+  o.add(buildLogMetric());
+  return o;
+}
+
+checkUnnamed255(core.List<api.LogMetric> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkLogMetric(o[0]);
+  checkLogMetric(o[1]);
+}
+
+core.int buildCounterListLogMetricsResponse = 0;
+buildListLogMetricsResponse() {
+  var o = new api.ListLogMetricsResponse();
+  buildCounterListLogMetricsResponse++;
+  if (buildCounterListLogMetricsResponse < 3) {
+    o.metrics = buildUnnamed255();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListLogMetricsResponse--;
+  return o;
+}
+
+checkListLogMetricsResponse(api.ListLogMetricsResponse o) {
+  buildCounterListLogMetricsResponse++;
+  if (buildCounterListLogMetricsResponse < 3) {
+    checkUnnamed255(o.metrics);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListLogMetricsResponse--;
+}
+
 buildUnnamed256() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -164,122 +406,12 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterListLogEntriesRequest = 0;
-buildListLogEntriesRequest() {
-  var o = new api.ListLogEntriesRequest();
-  buildCounterListLogEntriesRequest++;
-  if (buildCounterListLogEntriesRequest < 3) {
-    o.filter = "foo";
-    o.orderBy = "foo";
-    o.pageSize = 42;
-    o.pageToken = "foo";
-    o.projectIds = buildUnnamed255();
-    o.resourceNames = buildUnnamed256();
-  }
-  buildCounterListLogEntriesRequest--;
-  return o;
-}
-
-checkListLogEntriesRequest(api.ListLogEntriesRequest o) {
-  buildCounterListLogEntriesRequest++;
-  if (buildCounterListLogEntriesRequest < 3) {
-    unittest.expect(o.filter, unittest.equals('foo'));
-    unittest.expect(o.orderBy, unittest.equals('foo'));
-    unittest.expect(o.pageSize, unittest.equals(42));
-    unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed255(o.projectIds);
-    checkUnnamed256(o.resourceNames);
-  }
-  buildCounterListLogEntriesRequest--;
-}
-
-buildUnnamed257() {
-  var o = new core.List<api.LogEntry>();
-  o.add(buildLogEntry());
-  o.add(buildLogEntry());
-  return o;
-}
-
-checkUnnamed257(core.List<api.LogEntry> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkLogEntry(o[0]);
-  checkLogEntry(o[1]);
-}
-
-core.int buildCounterListLogEntriesResponse = 0;
-buildListLogEntriesResponse() {
-  var o = new api.ListLogEntriesResponse();
-  buildCounterListLogEntriesResponse++;
-  if (buildCounterListLogEntriesResponse < 3) {
-    o.entries = buildUnnamed257();
-    o.nextPageToken = "foo";
-  }
-  buildCounterListLogEntriesResponse--;
-  return o;
-}
-
-checkListLogEntriesResponse(api.ListLogEntriesResponse o) {
-  buildCounterListLogEntriesResponse++;
-  if (buildCounterListLogEntriesResponse < 3) {
-    checkUnnamed257(o.entries);
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterListLogEntriesResponse--;
-}
-
-buildUnnamed258() {
-  var o = new core.List<api.LogMetric>();
-  o.add(buildLogMetric());
-  o.add(buildLogMetric());
-  return o;
-}
-
-checkUnnamed258(core.List<api.LogMetric> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkLogMetric(o[0]);
-  checkLogMetric(o[1]);
-}
-
-core.int buildCounterListLogMetricsResponse = 0;
-buildListLogMetricsResponse() {
-  var o = new api.ListLogMetricsResponse();
-  buildCounterListLogMetricsResponse++;
-  if (buildCounterListLogMetricsResponse < 3) {
-    o.metrics = buildUnnamed258();
-    o.nextPageToken = "foo";
-  }
-  buildCounterListLogMetricsResponse--;
-  return o;
-}
-
-checkListLogMetricsResponse(api.ListLogMetricsResponse o) {
-  buildCounterListLogMetricsResponse++;
-  if (buildCounterListLogMetricsResponse < 3) {
-    checkUnnamed258(o.metrics);
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-  }
-  buildCounterListLogMetricsResponse--;
-}
-
-buildUnnamed259() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed259(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterListLogsResponse = 0;
 buildListLogsResponse() {
   var o = new api.ListLogsResponse();
   buildCounterListLogsResponse++;
   if (buildCounterListLogsResponse < 3) {
-    o.logNames = buildUnnamed259();
+    o.logNames = buildUnnamed256();
     o.nextPageToken = "foo";
   }
   buildCounterListLogsResponse--;
@@ -289,20 +421,20 @@
 checkListLogsResponse(api.ListLogsResponse o) {
   buildCounterListLogsResponse++;
   if (buildCounterListLogsResponse < 3) {
-    checkUnnamed259(o.logNames);
+    checkUnnamed256(o.logNames);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListLogsResponse--;
 }
 
-buildUnnamed260() {
+buildUnnamed257() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed260(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed257(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
@@ -314,29 +446,30 @@
   buildCounterListMonitoredResourceDescriptorsResponse++;
   if (buildCounterListMonitoredResourceDescriptorsResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceDescriptors = buildUnnamed260();
+    o.resourceDescriptors = buildUnnamed257();
   }
   buildCounterListMonitoredResourceDescriptorsResponse--;
   return o;
 }
 
-checkListMonitoredResourceDescriptorsResponse(api.ListMonitoredResourceDescriptorsResponse o) {
+checkListMonitoredResourceDescriptorsResponse(
+    api.ListMonitoredResourceDescriptorsResponse o) {
   buildCounterListMonitoredResourceDescriptorsResponse++;
   if (buildCounterListMonitoredResourceDescriptorsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed260(o.resourceDescriptors);
+    checkUnnamed257(o.resourceDescriptors);
   }
   buildCounterListMonitoredResourceDescriptorsResponse--;
 }
 
-buildUnnamed261() {
+buildUnnamed258() {
   var o = new core.List<api.LogSink>();
   o.add(buildLogSink());
   o.add(buildLogSink());
   return o;
 }
 
-checkUnnamed261(core.List<api.LogSink> o) {
+checkUnnamed258(core.List<api.LogSink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogSink(o[0]);
   checkLogSink(o[1]);
@@ -348,7 +481,7 @@
   buildCounterListSinksResponse++;
   if (buildCounterListSinksResponse < 3) {
     o.nextPageToken = "foo";
-    o.sinks = buildUnnamed261();
+    o.sinks = buildUnnamed258();
   }
   buildCounterListSinksResponse--;
   return o;
@@ -358,48 +491,80 @@
   buildCounterListSinksResponse++;
   if (buildCounterListSinksResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed261(o.sinks);
+    checkUnnamed258(o.sinks);
   }
   buildCounterListSinksResponse--;
 }
 
-buildUnnamed262() {
+buildUnnamed259() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed262(core.Map<core.String, core.Object> o) {
+checkUnnamed259(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed263() {
+buildUnnamed260() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed263(core.Map<core.String, core.String> o) {
+checkUnnamed260(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed264() {
+buildUnnamed261() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed264(core.Map<core.String, core.Object> o) {
+checkUnnamed261(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterLogEntry = 0;
@@ -409,11 +574,11 @@
   if (buildCounterLogEntry < 3) {
     o.httpRequest = buildHttpRequest();
     o.insertId = "foo";
-    o.jsonPayload = buildUnnamed262();
-    o.labels = buildUnnamed263();
+    o.jsonPayload = buildUnnamed259();
+    o.labels = buildUnnamed260();
     o.logName = "foo";
     o.operation = buildLogEntryOperation();
-    o.protoPayload = buildUnnamed264();
+    o.protoPayload = buildUnnamed261();
     o.receiveTimestamp = "foo";
     o.resource = buildMonitoredResource();
     o.severity = "foo";
@@ -431,11 +596,11 @@
   if (buildCounterLogEntry < 3) {
     checkHttpRequest(o.httpRequest);
     unittest.expect(o.insertId, unittest.equals('foo'));
-    checkUnnamed262(o.jsonPayload);
-    checkUnnamed263(o.labels);
+    checkUnnamed259(o.jsonPayload);
+    checkUnnamed260(o.labels);
     unittest.expect(o.logName, unittest.equals('foo'));
     checkLogEntryOperation(o.operation);
-    checkUnnamed264(o.protoPayload);
+    checkUnnamed261(o.protoPayload);
     unittest.expect(o.receiveTimestamp, unittest.equals('foo'));
     checkMonitoredResource(o.resource);
     unittest.expect(o.severity, unittest.equals('foo'));
@@ -495,6 +660,31 @@
   buildCounterLogEntrySourceLocation--;
 }
 
+core.int buildCounterLogExclusion = 0;
+buildLogExclusion() {
+  var o = new api.LogExclusion();
+  buildCounterLogExclusion++;
+  if (buildCounterLogExclusion < 3) {
+    o.description = "foo";
+    o.disabled = true;
+    o.filter = "foo";
+    o.name = "foo";
+  }
+  buildCounterLogExclusion--;
+  return o;
+}
+
+checkLogExclusion(api.LogExclusion o) {
+  buildCounterLogExclusion++;
+  if (buildCounterLogExclusion < 3) {
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.disabled, unittest.isTrue);
+    unittest.expect(o.filter, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterLogExclusion--;
+}
+
 core.int buildCounterLogLine = 0;
 buildLogLine() {
   var o = new api.LogLine();
@@ -520,14 +710,31 @@
   buildCounterLogLine--;
 }
 
+buildUnnamed262() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed262(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 core.int buildCounterLogMetric = 0;
 buildLogMetric() {
   var o = new api.LogMetric();
   buildCounterLogMetric++;
   if (buildCounterLogMetric < 3) {
+    o.bucketOptions = buildBucketOptions();
     o.description = "foo";
     o.filter = "foo";
+    o.labelExtractors = buildUnnamed262();
+    o.metricDescriptor = buildMetricDescriptor();
     o.name = "foo";
+    o.valueExtractor = "foo";
     o.version = "foo";
   }
   buildCounterLogMetric--;
@@ -537,9 +744,13 @@
 checkLogMetric(api.LogMetric o) {
   buildCounterLogMetric++;
   if (buildCounterLogMetric < 3) {
+    checkBucketOptions(o.bucketOptions);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.filter, unittest.equals('foo'));
+    checkUnnamed262(o.labelExtractors);
+    checkMetricDescriptor(o.metricDescriptor);
     unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.valueExtractor, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterLogMetric--;
@@ -578,14 +789,60 @@
   buildCounterLogSink--;
 }
 
-buildUnnamed265() {
+buildUnnamed263() {
+  var o = new core.List<api.LabelDescriptor>();
+  o.add(buildLabelDescriptor());
+  o.add(buildLabelDescriptor());
+  return o;
+}
+
+checkUnnamed263(core.List<api.LabelDescriptor> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkLabelDescriptor(o[0]);
+  checkLabelDescriptor(o[1]);
+}
+
+core.int buildCounterMetricDescriptor = 0;
+buildMetricDescriptor() {
+  var o = new api.MetricDescriptor();
+  buildCounterMetricDescriptor++;
+  if (buildCounterMetricDescriptor < 3) {
+    o.description = "foo";
+    o.displayName = "foo";
+    o.labels = buildUnnamed263();
+    o.metricKind = "foo";
+    o.name = "foo";
+    o.type = "foo";
+    o.unit = "foo";
+    o.valueType = "foo";
+  }
+  buildCounterMetricDescriptor--;
+  return o;
+}
+
+checkMetricDescriptor(api.MetricDescriptor o) {
+  buildCounterMetricDescriptor++;
+  if (buildCounterMetricDescriptor < 3) {
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.displayName, unittest.equals('foo'));
+    checkUnnamed263(o.labels);
+    unittest.expect(o.metricKind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.unit, unittest.equals('foo'));
+    unittest.expect(o.valueType, unittest.equals('foo'));
+  }
+  buildCounterMetricDescriptor--;
+}
+
+buildUnnamed264() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed265(core.Map<core.String, core.String> o) {
+checkUnnamed264(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -596,7 +853,7 @@
   var o = new api.MonitoredResource();
   buildCounterMonitoredResource++;
   if (buildCounterMonitoredResource < 3) {
-    o.labels = buildUnnamed265();
+    o.labels = buildUnnamed264();
     o.type = "foo";
   }
   buildCounterMonitoredResource--;
@@ -606,20 +863,20 @@
 checkMonitoredResource(api.MonitoredResource o) {
   buildCounterMonitoredResource++;
   if (buildCounterMonitoredResource < 3) {
-    checkUnnamed265(o.labels);
+    checkUnnamed264(o.labels);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResource--;
 }
 
-buildUnnamed266() {
+buildUnnamed265() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed266(core.List<api.LabelDescriptor> o) {
+checkUnnamed265(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -632,7 +889,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed266();
+    o.labels = buildUnnamed265();
     o.name = "foo";
     o.type = "foo";
   }
@@ -645,34 +902,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed266(o.labels);
+    checkUnnamed265(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed267() {
+buildUnnamed266() {
   var o = new core.List<api.LogLine>();
   o.add(buildLogLine());
   o.add(buildLogLine());
   return o;
 }
 
-checkUnnamed267(core.List<api.LogLine> o) {
+checkUnnamed266(core.List<api.LogLine> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogLine(o[0]);
   checkLogLine(o[1]);
 }
 
-buildUnnamed268() {
+buildUnnamed267() {
   var o = new core.List<api.SourceReference>();
   o.add(buildSourceReference());
   o.add(buildSourceReference());
   return o;
 }
 
-checkUnnamed268(core.List<api.SourceReference> o) {
+checkUnnamed267(core.List<api.SourceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSourceReference(o[0]);
   checkSourceReference(o[1]);
@@ -695,7 +952,7 @@
     o.instanceIndex = 42;
     o.ip = "foo";
     o.latency = "foo";
-    o.line = buildUnnamed267();
+    o.line = buildUnnamed266();
     o.megaCycles = "foo";
     o.method = "foo";
     o.moduleId = "foo";
@@ -705,7 +962,7 @@
     o.requestId = "foo";
     o.resource = "foo";
     o.responseSize = "foo";
-    o.sourceReference = buildUnnamed268();
+    o.sourceReference = buildUnnamed267();
     o.startTime = "foo";
     o.status = 42;
     o.taskName = "foo";
@@ -735,7 +992,7 @@
     unittest.expect(o.instanceIndex, unittest.equals(42));
     unittest.expect(o.ip, unittest.equals('foo'));
     unittest.expect(o.latency, unittest.equals('foo'));
-    checkUnnamed267(o.line);
+    checkUnnamed266(o.line);
     unittest.expect(o.megaCycles, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.moduleId, unittest.equals('foo'));
@@ -745,7 +1002,7 @@
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
     unittest.expect(o.responseSize, unittest.equals('foo'));
-    checkUnnamed268(o.sourceReference);
+    checkUnnamed267(o.sourceReference);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals(42));
     unittest.expect(o.taskName, unittest.equals('foo'));
@@ -803,27 +1060,27 @@
   buildCounterSourceReference--;
 }
 
-buildUnnamed269() {
+buildUnnamed268() {
   var o = new core.List<api.LogEntry>();
   o.add(buildLogEntry());
   o.add(buildLogEntry());
   return o;
 }
 
-checkUnnamed269(core.List<api.LogEntry> o) {
+checkUnnamed268(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogEntry(o[0]);
   checkLogEntry(o[1]);
 }
 
-buildUnnamed270() {
+buildUnnamed269() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed270(core.Map<core.String, core.String> o) {
+checkUnnamed269(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -834,8 +1091,8 @@
   var o = new api.WriteLogEntriesRequest();
   buildCounterWriteLogEntriesRequest++;
   if (buildCounterWriteLogEntriesRequest < 3) {
-    o.entries = buildUnnamed269();
-    o.labels = buildUnnamed270();
+    o.entries = buildUnnamed268();
+    o.labels = buildUnnamed269();
     o.logName = "foo";
     o.partialSuccess = true;
     o.resource = buildMonitoredResource();
@@ -847,8 +1104,8 @@
 checkWriteLogEntriesRequest(api.WriteLogEntriesRequest o) {
   buildCounterWriteLogEntriesRequest++;
   if (buildCounterWriteLogEntriesRequest < 3) {
-    checkUnnamed269(o.entries);
-    checkUnnamed270(o.labels);
+    checkUnnamed268(o.entries);
+    checkUnnamed269(o.labels);
     unittest.expect(o.logName, unittest.equals('foo'));
     unittest.expect(o.partialSuccess, unittest.isTrue);
     checkMonitoredResource(o.resource);
@@ -860,21 +1117,26 @@
 buildWriteLogEntriesResponse() {
   var o = new api.WriteLogEntriesResponse();
   buildCounterWriteLogEntriesResponse++;
-  if (buildCounterWriteLogEntriesResponse < 3) {
-  }
+  if (buildCounterWriteLogEntriesResponse < 3) {}
   buildCounterWriteLogEntriesResponse--;
   return o;
 }
 
 checkWriteLogEntriesResponse(api.WriteLogEntriesResponse o) {
   buildCounterWriteLogEntriesResponse++;
-  if (buildCounterWriteLogEntriesResponse < 3) {
-  }
+  if (buildCounterWriteLogEntriesResponse < 3) {}
   buildCounterWriteLogEntriesResponse--;
 }
 
-
 main() {
+  unittest.group("obj-schema-BucketOptions", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBucketOptions();
+      var od = new api.BucketOptions.fromJson(o.toJson());
+      checkBucketOptions(od);
+    });
+  });
+
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -883,6 +1145,21 @@
     });
   });
 
+  unittest.group("obj-schema-Explicit", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExplicit();
+      var od = new api.Explicit.fromJson(o.toJson());
+      checkExplicit(od);
+    });
+  });
+
+  unittest.group("obj-schema-Exponential", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExponential();
+      var od = new api.Exponential.fromJson(o.toJson());
+      checkExponential(od);
+    });
+  });
 
   unittest.group("obj-schema-HttpRequest", () {
     unittest.test("to-json--from-json", () {
@@ -892,7 +1169,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LabelDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildLabelDescriptor();
@@ -901,6 +1177,21 @@
     });
   });
 
+  unittest.group("obj-schema-Linear", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildLinear();
+      var od = new api.Linear.fromJson(o.toJson());
+      checkLinear(od);
+    });
+  });
+
+  unittest.group("obj-schema-ListExclusionsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListExclusionsResponse();
+      var od = new api.ListExclusionsResponse.fromJson(o.toJson());
+      checkListExclusionsResponse(od);
+    });
+  });
 
   unittest.group("obj-schema-ListLogEntriesRequest", () {
     unittest.test("to-json--from-json", () {
@@ -910,7 +1201,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListLogEntriesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListLogEntriesResponse();
@@ -919,7 +1209,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListLogMetricsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListLogMetricsResponse();
@@ -928,7 +1217,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListLogsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListLogsResponse();
@@ -937,16 +1225,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ListMonitoredResourceDescriptorsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListMonitoredResourceDescriptorsResponse();
-      var od = new api.ListMonitoredResourceDescriptorsResponse.fromJson(o.toJson());
+      var od =
+          new api.ListMonitoredResourceDescriptorsResponse.fromJson(o.toJson());
       checkListMonitoredResourceDescriptorsResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-ListSinksResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListSinksResponse();
@@ -955,7 +1242,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogEntry();
@@ -964,7 +1250,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogEntryOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogEntryOperation();
@@ -973,7 +1258,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogEntrySourceLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogEntrySourceLocation();
@@ -982,6 +1266,13 @@
     });
   });
 
+  unittest.group("obj-schema-LogExclusion", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildLogExclusion();
+      var od = new api.LogExclusion.fromJson(o.toJson());
+      checkLogExclusion(od);
+    });
+  });
 
   unittest.group("obj-schema-LogLine", () {
     unittest.test("to-json--from-json", () {
@@ -991,7 +1282,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogMetric", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogMetric();
@@ -1000,7 +1290,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogSink", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogSink();
@@ -1009,6 +1298,13 @@
     });
   });
 
+  unittest.group("obj-schema-MetricDescriptor", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMetricDescriptor();
+      var od = new api.MetricDescriptor.fromJson(o.toJson());
+      checkMetricDescriptor(od);
+    });
+  });
 
   unittest.group("obj-schema-MonitoredResource", () {
     unittest.test("to-json--from-json", () {
@@ -1018,7 +1314,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonitoredResourceDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoredResourceDescriptor();
@@ -1027,7 +1322,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RequestLog", () {
     unittest.test("to-json--from-json", () {
       var o = buildRequestLog();
@@ -1036,7 +1330,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceLocation();
@@ -1045,7 +1338,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceReference();
@@ -1054,7 +1346,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WriteLogEntriesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildWriteLogEntriesRequest();
@@ -1063,7 +1354,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WriteLogEntriesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildWriteLogEntriesResponse();
@@ -1072,21 +1362,26 @@
     });
   });
 
-
-  unittest.group("resource-BillingAccountsLogsResourceApi", () {
-    unittest.test("method--delete", () {
-
+  unittest.group("resource-BillingAccountsExclusionsResourceApi", () {
+    unittest.test("method--create", () {
       var mock = new HttpServerMock();
-      api.BillingAccountsLogsResourceApi res = new api.LoggingApi(mock).billingAccounts.logs;
-      var arg_logName = "foo";
+      api.BillingAccountsExclusionsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1100,16 +1395,280 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.BillingAccountsExclusionsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_name).then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.BillingAccountsExclusionsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.BillingAccountsExclusionsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.exclusions;
+      var arg_parent = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListExclusionsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
+        checkListExclusionsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.BillingAccountsExclusionsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_name = "foo";
+      var arg_updateMask = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-BillingAccountsLogsResourceApi", () {
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.BillingAccountsLogsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.logs;
+      var arg_logName = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1120,9 +1679,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsLogsResourceApi res = new api.LoggingApi(mock).billingAccounts.logs;
+      api.BillingAccountsLogsResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.logs;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -1131,9 +1690,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1147,35 +1708,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLogsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListLogsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLogsResponse response) {
         checkListLogsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-BillingAccountsSinksResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsSinksResourceApi res = new api.LoggingApi(mock).billingAccounts.sinks;
+      api.BillingAccountsSinksResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.sinks;
       var arg_request = buildLogSink();
       var arg_parent = "foo";
       var arg_uniqueWriterIdentity = true;
@@ -1187,9 +1751,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1203,39 +1769,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .create(arg_request, arg_parent,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsSinksResourceApi res = new api.LoggingApi(mock).billingAccounts.sinks;
+      api.BillingAccountsSinksResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.sinks;
       var arg_sinkName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1249,38 +1822,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_sinkName).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_sinkName)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsSinksResourceApi res = new api.LoggingApi(mock).billingAccounts.sinks;
+      api.BillingAccountsSinksResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.sinks;
       var arg_sinkName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1294,16 +1872,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1314,9 +1893,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsSinksResourceApi res = new api.LoggingApi(mock).billingAccounts.sinks;
+      api.BillingAccountsSinksResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.sinks;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -1325,9 +1904,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1341,33 +1922,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSinksResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListSinksResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListSinksResponse response) {
         checkListSinksResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsSinksResourceApi res = new api.LoggingApi(mock).billingAccounts.sinks;
+      api.BillingAccountsSinksResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -1377,9 +1964,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1393,32 +1982,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .patch(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.BillingAccountsSinksResourceApi res = new api.LoggingApi(mock).billingAccounts.sinks;
+      api.BillingAccountsSinksResourceApi res =
+          new api.LoggingApi(mock).billingAccounts.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -1428,9 +2026,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1444,32 +2044,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .update(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EntriesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.EntriesResourceApi res = new api.LoggingApi(mock).entries;
       var arg_request = buildListLogEntriesRequest();
@@ -1481,9 +2086,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v2/entries:list"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v2/entries:list"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -1496,27 +2103,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLogEntriesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_request).then(unittest.expectAsync1(((api.ListLogEntriesResponse response) {
+      res
+          .list(arg_request)
+          .then(unittest.expectAsync1(((api.ListLogEntriesResponse response) {
         checkListLogEntriesResponse(response);
       })));
     });
 
     unittest.test("method--write", () {
-
       var mock = new HttpServerMock();
       api.EntriesResourceApi res = new api.LoggingApi(mock).entries;
       var arg_request = buildWriteLogEntriesRequest();
@@ -1528,9 +2137,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("v2/entries:write"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("v2/entries:write"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -1543,42 +2154,49 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWriteLogEntriesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.write(arg_request).then(unittest.expectAsync1(((api.WriteLogEntriesResponse response) {
+      res
+          .write(arg_request)
+          .then(unittest.expectAsync1(((api.WriteLogEntriesResponse response) {
         checkWriteLogEntriesResponse(response);
       })));
     });
-
   });
 
-
-  unittest.group("resource-FoldersLogsResourceApi", () {
-    unittest.test("method--delete", () {
-
+  unittest.group("resource-FoldersExclusionsResourceApi", () {
+    unittest.test("method--create", () {
       var mock = new HttpServerMock();
-      api.FoldersLogsResourceApi res = new api.LoggingApi(mock).folders.logs;
-      var arg_logName = "foo";
+      api.FoldersExclusionsResourceApi res =
+          new api.LoggingApi(mock).folders.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1592,16 +2210,279 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.FoldersExclusionsResourceApi res =
+          new api.LoggingApi(mock).folders.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_name).then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.FoldersExclusionsResourceApi res =
+          new api.LoggingApi(mock).folders.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.FoldersExclusionsResourceApi res =
+          new api.LoggingApi(mock).folders.exclusions;
+      var arg_parent = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListExclusionsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
+        checkListExclusionsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.FoldersExclusionsResourceApi res =
+          new api.LoggingApi(mock).folders.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_name = "foo";
+      var arg_updateMask = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-FoldersLogsResourceApi", () {
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.FoldersLogsResourceApi res = new api.LoggingApi(mock).folders.logs;
+      var arg_logName = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1612,7 +2493,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.FoldersLogsResourceApi res = new api.LoggingApi(mock).folders.logs;
       var arg_parent = "foo";
@@ -1623,9 +2503,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1639,33 +2521,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLogsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListLogsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLogsResponse response) {
         checkListLogsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-FoldersSinksResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.FoldersSinksResourceApi res = new api.LoggingApi(mock).folders.sinks;
       var arg_request = buildLogSink();
@@ -1679,9 +2563,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1695,28 +2581,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .create(arg_request, arg_parent,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.FoldersSinksResourceApi res = new api.LoggingApi(mock).folders.sinks;
       var arg_sinkName = "foo";
@@ -1725,9 +2615,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1741,27 +2633,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_sinkName).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_sinkName)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.FoldersSinksResourceApi res = new api.LoggingApi(mock).folders.sinks;
       var arg_sinkName = "foo";
@@ -1770,9 +2664,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1786,16 +2682,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1806,7 +2703,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.FoldersSinksResourceApi res = new api.LoggingApi(mock).folders.sinks;
       var arg_parent = "foo";
@@ -1817,9 +2713,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1833,33 +2731,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSinksResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListSinksResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListSinksResponse response) {
         checkListSinksResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.FoldersSinksResourceApi res = new api.LoggingApi(mock).folders.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -1869,9 +2772,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1885,32 +2790,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .patch(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.FoldersSinksResourceApi res = new api.LoggingApi(mock).folders.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -1920,9 +2833,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1936,34 +2851,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .update(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MonitoredResourceDescriptorsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.MonitoredResourceDescriptorsResourceApi res = new api.LoggingApi(mock).monitoredResourceDescriptors;
+      api.MonitoredResourceDescriptorsResourceApi res =
+          new api.LoggingApi(mock).monitoredResourceDescriptors;
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1971,9 +2892,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("v2/monitoredResourceDescriptors"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 31),
+            unittest.equals("v2/monitoredResourceDescriptors"));
         pathOffset += 31;
 
         var query = (req.url).query;
@@ -1986,44 +2909,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildListMonitoredResourceDescriptorsResponse());
+        var resp = convert.JSON
+            .encode(buildListMonitoredResourceDescriptorsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListMonitoredResourceDescriptorsResponse response) {
+      res.list(pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest
+          .expectAsync1(
+              ((api.ListMonitoredResourceDescriptorsResponse response) {
         checkListMonitoredResourceDescriptorsResponse(response);
       })));
     });
-
   });
 
-
-  unittest.group("resource-OrganizationsLogsResourceApi", () {
-    unittest.test("method--delete", () {
-
+  unittest.group("resource-OrganizationsExclusionsResourceApi", () {
+    unittest.test("method--create", () {
       var mock = new HttpServerMock();
-      api.OrganizationsLogsResourceApi res = new api.LoggingApi(mock).organizations.logs;
-      var arg_logName = "foo";
+      api.OrganizationsExclusionsResourceApi res =
+          new api.LoggingApi(mock).organizations.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2037,16 +2970,280 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.OrganizationsExclusionsResourceApi res =
+          new api.LoggingApi(mock).organizations.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_name).then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.OrganizationsExclusionsResourceApi res =
+          new api.LoggingApi(mock).organizations.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.OrganizationsExclusionsResourceApi res =
+          new api.LoggingApi(mock).organizations.exclusions;
+      var arg_parent = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListExclusionsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
+        checkListExclusionsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.OrganizationsExclusionsResourceApi res =
+          new api.LoggingApi(mock).organizations.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_name = "foo";
+      var arg_updateMask = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+  });
+
+  unittest.group("resource-OrganizationsLogsResourceApi", () {
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.OrganizationsLogsResourceApi res =
+          new api.LoggingApi(mock).organizations.logs;
+      var arg_logName = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2057,9 +3254,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsLogsResourceApi res = new api.LoggingApi(mock).organizations.logs;
+      api.OrganizationsLogsResourceApi res =
+          new api.LoggingApi(mock).organizations.logs;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2068,9 +3265,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2084,35 +3283,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLogsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListLogsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLogsResponse response) {
         checkListLogsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-OrganizationsSinksResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsSinksResourceApi res = new api.LoggingApi(mock).organizations.sinks;
+      api.OrganizationsSinksResourceApi res =
+          new api.LoggingApi(mock).organizations.sinks;
       var arg_request = buildLogSink();
       var arg_parent = "foo";
       var arg_uniqueWriterIdentity = true;
@@ -2124,9 +3326,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2140,39 +3344,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .create(arg_request, arg_parent,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsSinksResourceApi res = new api.LoggingApi(mock).organizations.sinks;
+      api.OrganizationsSinksResourceApi res =
+          new api.LoggingApi(mock).organizations.sinks;
       var arg_sinkName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2186,38 +3397,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_sinkName).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_sinkName)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsSinksResourceApi res = new api.LoggingApi(mock).organizations.sinks;
+      api.OrganizationsSinksResourceApi res =
+          new api.LoggingApi(mock).organizations.sinks;
       var arg_sinkName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2231,16 +3447,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2251,9 +3468,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsSinksResourceApi res = new api.LoggingApi(mock).organizations.sinks;
+      api.OrganizationsSinksResourceApi res =
+          new api.LoggingApi(mock).organizations.sinks;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2262,9 +3479,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2278,33 +3497,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSinksResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListSinksResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListSinksResponse response) {
         checkListSinksResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsSinksResourceApi res = new api.LoggingApi(mock).organizations.sinks;
+      api.OrganizationsSinksResourceApi res =
+          new api.LoggingApi(mock).organizations.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -2314,9 +3539,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2330,32 +3557,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .patch(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.OrganizationsSinksResourceApi res = new api.LoggingApi(mock).organizations.sinks;
+      api.OrganizationsSinksResourceApi res =
+          new api.LoggingApi(mock).organizations.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -2365,9 +3601,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2381,32 +3619,304 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .update(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
-
   });
 
+  unittest.group("resource-ProjectsExclusionsResourceApi", () {
+    unittest.test("method--create", () {
+      var mock = new HttpServerMock();
+      api.ProjectsExclusionsResourceApi res =
+          new api.LoggingApi(mock).projects.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_parent = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+      var mock = new HttpServerMock();
+      api.ProjectsExclusionsResourceApi res =
+          new api.LoggingApi(mock).projects.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildEmpty());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_name).then(unittest.expectAsync1(((api.Empty response) {
+        checkEmpty(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+      var mock = new HttpServerMock();
+      api.ProjectsExclusionsResourceApi res =
+          new api.LoggingApi(mock).projects.exclusions;
+      var arg_name = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+      var mock = new HttpServerMock();
+      api.ProjectsExclusionsResourceApi res =
+          new api.LoggingApi(mock).projects.exclusions;
+      var arg_parent = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListExclusionsResponse());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListExclusionsResponse response) {
+        checkListExclusionsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+      var mock = new HttpServerMock();
+      api.ProjectsExclusionsResourceApi res =
+          new api.LoggingApi(mock).projects.exclusions;
+      var arg_request = buildLogExclusion();
+      var arg_name = "foo";
+      var arg_updateMask = "foo";
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = new api.LogExclusion.fromJson(json);
+        checkLogExclusion(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+
+        var h = {
+          "content-type": "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildLogExclusion());
+        return new async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .patch(arg_request, arg_name, updateMask: arg_updateMask)
+          .then(unittest.expectAsync1(((api.LogExclusion response) {
+        checkLogExclusion(response);
+      })));
+    });
+  });
 
   unittest.group("resource-ProjectsLogsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ProjectsLogsResourceApi res = new api.LoggingApi(mock).projects.logs;
       var arg_logName = "foo";
@@ -2415,9 +3925,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2431,16 +3943,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2451,7 +3964,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ProjectsLogsResourceApi res = new api.LoggingApi(mock).projects.logs;
       var arg_parent = "foo";
@@ -2462,9 +3974,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2478,35 +3992,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLogsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListLogsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLogsResponse response) {
         checkListLogsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsMetricsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsMetricsResourceApi res = new api.LoggingApi(mock).projects.metrics;
+      api.ProjectsMetricsResourceApi res =
+          new api.LoggingApi(mock).projects.metrics;
       var arg_request = buildLogMetric();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2517,9 +4034,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2533,38 +4052,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.LogMetric response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.LogMetric response) {
         checkLogMetric(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsMetricsResourceApi res = new api.LoggingApi(mock).projects.metrics;
+      api.ProjectsMetricsResourceApi res =
+          new api.LoggingApi(mock).projects.metrics;
       var arg_metricName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2578,38 +4102,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_metricName).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_metricName)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsMetricsResourceApi res = new api.LoggingApi(mock).projects.metrics;
+      api.ProjectsMetricsResourceApi res =
+          new api.LoggingApi(mock).projects.metrics;
       var arg_metricName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2623,29 +4152,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_metricName).then(unittest.expectAsync1(((api.LogMetric response) {
+      res
+          .get(arg_metricName)
+          .then(unittest.expectAsync1(((api.LogMetric response) {
         checkLogMetric(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsMetricsResourceApi res = new api.LoggingApi(mock).projects.metrics;
+      api.ProjectsMetricsResourceApi res =
+          new api.LoggingApi(mock).projects.metrics;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2654,9 +4186,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2670,31 +4204,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListLogMetricsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListLogMetricsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListLogMetricsResponse response) {
         checkListLogMetricsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsMetricsResourceApi res = new api.LoggingApi(mock).projects.metrics;
+      api.ProjectsMetricsResourceApi res =
+          new api.LoggingApi(mock).projects.metrics;
       var arg_request = buildLogMetric();
       var arg_metricName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2705,9 +4244,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2721,33 +4262,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogMetric());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_metricName).then(unittest.expectAsync1(((api.LogMetric response) {
+      res
+          .update(arg_request, arg_metricName)
+          .then(unittest.expectAsync1(((api.LogMetric response) {
         checkLogMetric(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsSinksResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSinksResourceApi res = new api.LoggingApi(mock).projects.sinks;
+      api.ProjectsSinksResourceApi res =
+          new api.LoggingApi(mock).projects.sinks;
       var arg_request = buildLogSink();
       var arg_parent = "foo";
       var arg_uniqueWriterIdentity = true;
@@ -2759,9 +4301,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2775,39 +4319,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .create(arg_request, arg_parent,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSinksResourceApi res = new api.LoggingApi(mock).projects.sinks;
+      api.ProjectsSinksResourceApi res =
+          new api.LoggingApi(mock).projects.sinks;
       var arg_sinkName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2821,38 +4372,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_sinkName).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_sinkName)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSinksResourceApi res = new api.LoggingApi(mock).projects.sinks;
+      api.ProjectsSinksResourceApi res =
+          new api.LoggingApi(mock).projects.sinks;
       var arg_sinkName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2866,16 +4422,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2886,9 +4443,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSinksResourceApi res = new api.LoggingApi(mock).projects.sinks;
+      api.ProjectsSinksResourceApi res =
+          new api.LoggingApi(mock).projects.sinks;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2897,9 +4454,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2913,33 +4472,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSinksResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListSinksResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListSinksResponse response) {
         checkListSinksResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSinksResourceApi res = new api.LoggingApi(mock).projects.sinks;
+      api.ProjectsSinksResourceApi res =
+          new api.LoggingApi(mock).projects.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -2949,9 +4514,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2965,32 +4532,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .patch(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSinksResourceApi res = new api.LoggingApi(mock).projects.sinks;
+      api.ProjectsSinksResourceApi res =
+          new api.LoggingApi(mock).projects.sinks;
       var arg_request = buildLogSink();
       var arg_sinkName = "foo";
+      var arg_updateMask = "foo";
       var arg_uniqueWriterIdentity = true;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.LogSink.fromJson(json);
@@ -3000,9 +4576,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v2/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3016,28 +4594,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["uniqueWriterIdentity"].first, unittest.equals("$arg_uniqueWriterIdentity"));
-
+        unittest.expect(
+            queryMap["updateMask"].first, unittest.equals(arg_updateMask));
+        unittest.expect(queryMap["uniqueWriterIdentity"].first,
+            unittest.equals("$arg_uniqueWriterIdentity"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLogSink());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_sinkName, uniqueWriterIdentity: arg_uniqueWriterIdentity).then(unittest.expectAsync1(((api.LogSink response) {
+      res
+          .update(arg_request, arg_sinkName,
+              updateMask: arg_updateMask,
+              uniqueWriterIdentity: arg_uniqueWriterIdentity)
+          .then(unittest.expectAsync1(((api.LogSink response) {
         checkLogSink(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/manufacturers/v1_test.dart b/generated/googleapis/test/manufacturers/v1_test.dart
index f73a210..6518235 100644
--- a/generated/googleapis/test/manufacturers/v1_test.dart
+++ b/generated/googleapis/test/manufacturers/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.manufacturers.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/manufacturers/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,85 +44,85 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1604() {
+buildUnnamed1599() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed1604(core.List<api.Image> o) {
+checkUnnamed1599(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
 }
 
-buildUnnamed1605() {
+buildUnnamed1600() {
   var o = new core.List<api.FeatureDescription>();
   o.add(buildFeatureDescription());
   o.add(buildFeatureDescription());
   return o;
 }
 
-checkUnnamed1605(core.List<api.FeatureDescription> o) {
+checkUnnamed1600(core.List<api.FeatureDescription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeatureDescription(o[0]);
   checkFeatureDescription(o[1]);
 }
 
-buildUnnamed1606() {
+buildUnnamed1601() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1606(core.List<core.String> o) {
+checkUnnamed1601(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1607() {
+buildUnnamed1602() {
   var o = new core.List<api.ProductDetail>();
   o.add(buildProductDetail());
   o.add(buildProductDetail());
   return o;
 }
 
-checkUnnamed1607(core.List<api.ProductDetail> o) {
+checkUnnamed1602(core.List<api.ProductDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDetail(o[0]);
   checkProductDetail(o[1]);
 }
 
-buildUnnamed1608() {
+buildUnnamed1603() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1608(core.List<core.String> o) {
+checkUnnamed1603(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1609() {
+buildUnnamed1604() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1609(core.List<core.String> o) {
+checkUnnamed1604(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -134,7 +133,7 @@
   var o = new api.Attributes();
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    o.additionalImageLink = buildUnnamed1604();
+    o.additionalImageLink = buildUnnamed1599();
     o.ageGroup = "foo";
     o.brand = "foo";
     o.capacity = buildCapacity();
@@ -142,21 +141,21 @@
     o.count = buildCount();
     o.description = "foo";
     o.disclosureDate = "foo";
-    o.featureDescription = buildUnnamed1605();
+    o.featureDescription = buildUnnamed1600();
     o.flavor = "foo";
     o.format = "foo";
     o.gender = "foo";
-    o.gtin = buildUnnamed1606();
+    o.gtin = buildUnnamed1601();
     o.imageLink = buildImage();
     o.itemGroupId = "foo";
     o.material = "foo";
     o.mpn = "foo";
     o.pattern = "foo";
-    o.productDetail = buildUnnamed1607();
+    o.productDetail = buildUnnamed1602();
     o.productLine = "foo";
     o.productName = "foo";
     o.productPageUrl = "foo";
-    o.productType = buildUnnamed1608();
+    o.productType = buildUnnamed1603();
     o.releaseDate = "foo";
     o.scent = "foo";
     o.size = "foo";
@@ -166,7 +165,7 @@
     o.targetAccountId = "foo";
     o.theme = "foo";
     o.title = "foo";
-    o.videoLink = buildUnnamed1609();
+    o.videoLink = buildUnnamed1604();
   }
   buildCounterAttributes--;
   return o;
@@ -175,7 +174,7 @@
 checkAttributes(api.Attributes o) {
   buildCounterAttributes++;
   if (buildCounterAttributes < 3) {
-    checkUnnamed1604(o.additionalImageLink);
+    checkUnnamed1599(o.additionalImageLink);
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.brand, unittest.equals('foo'));
     checkCapacity(o.capacity);
@@ -183,21 +182,21 @@
     checkCount(o.count);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.disclosureDate, unittest.equals('foo'));
-    checkUnnamed1605(o.featureDescription);
+    checkUnnamed1600(o.featureDescription);
     unittest.expect(o.flavor, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
-    checkUnnamed1606(o.gtin);
+    checkUnnamed1601(o.gtin);
     checkImage(o.imageLink);
     unittest.expect(o.itemGroupId, unittest.equals('foo'));
     unittest.expect(o.material, unittest.equals('foo'));
     unittest.expect(o.mpn, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed1607(o.productDetail);
+    checkUnnamed1602(o.productDetail);
     unittest.expect(o.productLine, unittest.equals('foo'));
     unittest.expect(o.productName, unittest.equals('foo'));
     unittest.expect(o.productPageUrl, unittest.equals('foo'));
-    checkUnnamed1608(o.productType);
+    checkUnnamed1603(o.productType);
     unittest.expect(o.releaseDate, unittest.equals('foo'));
     unittest.expect(o.scent, unittest.equals('foo'));
     unittest.expect(o.size, unittest.equals('foo'));
@@ -207,7 +206,7 @@
     unittest.expect(o.targetAccountId, unittest.equals('foo'));
     unittest.expect(o.theme, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1609(o.videoLink);
+    checkUnnamed1604(o.videoLink);
   }
   buildCounterAttributes--;
 }
@@ -258,16 +257,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -344,14 +341,14 @@
   buildCounterIssue--;
 }
 
-buildUnnamed1610() {
+buildUnnamed1605() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed1610(core.List<api.Product> o) {
+checkUnnamed1605(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -363,7 +360,7 @@
   buildCounterListProductsResponse++;
   if (buildCounterListProductsResponse < 3) {
     o.nextPageToken = "foo";
-    o.products = buildUnnamed1610();
+    o.products = buildUnnamed1605();
   }
   buildCounterListProductsResponse--;
   return o;
@@ -373,7 +370,7 @@
   buildCounterListProductsResponse++;
   if (buildCounterListProductsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1610(o.products);
+    checkUnnamed1605(o.products);
   }
   buildCounterListProductsResponse--;
 }
@@ -399,27 +396,27 @@
   buildCounterPrice--;
 }
 
-buildUnnamed1611() {
+buildUnnamed1606() {
   var o = new core.List<api.Issue>();
   o.add(buildIssue());
   o.add(buildIssue());
   return o;
 }
 
-checkUnnamed1611(core.List<api.Issue> o) {
+checkUnnamed1606(core.List<api.Issue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIssue(o[0]);
   checkIssue(o[1]);
 }
 
-buildUnnamed1612() {
+buildUnnamed1607() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1612(core.List<core.String> o) {
+checkUnnamed1607(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -432,8 +429,8 @@
   if (buildCounterProduct < 3) {
     o.contentLanguage = "foo";
     o.finalAttributes = buildAttributes();
-    o.issues = buildUnnamed1611();
-    o.manuallyDeletedAttributes = buildUnnamed1612();
+    o.issues = buildUnnamed1606();
+    o.manuallyDeletedAttributes = buildUnnamed1607();
     o.manuallyProvidedAttributes = buildAttributes();
     o.name = "foo";
     o.parent = "foo";
@@ -450,8 +447,8 @@
   if (buildCounterProduct < 3) {
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
     checkAttributes(o.finalAttributes);
-    checkUnnamed1611(o.issues);
-    checkUnnamed1612(o.manuallyDeletedAttributes);
+    checkUnnamed1606(o.issues);
+    checkUnnamed1607(o.manuallyDeletedAttributes);
     checkAttributes(o.manuallyProvidedAttributes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
@@ -485,7 +482,6 @@
   buildCounterProductDetail--;
 }
 
-
 main() {
   unittest.group("obj-schema-Attributes", () {
     unittest.test("to-json--from-json", () {
@@ -495,7 +491,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Capacity", () {
     unittest.test("to-json--from-json", () {
       var o = buildCapacity();
@@ -504,7 +499,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Count", () {
     unittest.test("to-json--from-json", () {
       var o = buildCount();
@@ -513,7 +507,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -522,7 +515,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FeatureDescription", () {
     unittest.test("to-json--from-json", () {
       var o = buildFeatureDescription();
@@ -531,7 +523,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Image", () {
     unittest.test("to-json--from-json", () {
       var o = buildImage();
@@ -540,7 +531,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Issue", () {
     unittest.test("to-json--from-json", () {
       var o = buildIssue();
@@ -549,7 +539,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListProductsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListProductsResponse();
@@ -558,7 +547,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Price", () {
     unittest.test("to-json--from-json", () {
       var o = buildPrice();
@@ -567,7 +555,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Product", () {
     unittest.test("to-json--from-json", () {
       var o = buildProduct();
@@ -576,7 +563,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ProductDetail", () {
     unittest.test("to-json--from-json", () {
       var o = buildProductDetail();
@@ -585,12 +571,11 @@
     });
   });
 
-
   unittest.group("resource-AccountsProductsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.AccountsProductsResourceApi res = new api.ManufacturersApi(mock).accounts.products;
+      api.AccountsProductsResourceApi res =
+          new api.ManufacturersApi(mock).accounts.products;
       var arg_parent = "foo";
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -598,9 +583,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -614,29 +601,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_parent, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_parent, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.AccountsProductsResourceApi res = new api.ManufacturersApi(mock).accounts.products;
+      api.AccountsProductsResourceApi res =
+          new api.ManufacturersApi(mock).accounts.products;
       var arg_parent = "foo";
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -644,9 +634,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -660,29 +652,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_parent, arg_name).then(unittest.expectAsync1(((api.Product response) {
+      res
+          .get(arg_parent, arg_name)
+          .then(unittest.expectAsync1(((api.Product response) {
         checkProduct(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.AccountsProductsResourceApi res = new api.ManufacturersApi(mock).accounts.products;
+      api.AccountsProductsResourceApi res =
+          new api.ManufacturersApi(mock).accounts.products;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -691,9 +686,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -707,31 +704,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListProductsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListProductsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListProductsResponse response) {
         checkListProductsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.AccountsProductsResourceApi res = new api.ManufacturersApi(mock).accounts.products;
+      api.AccountsProductsResourceApi res =
+          new api.ManufacturersApi(mock).accounts.products;
       var arg_request = buildProduct();
       var arg_parent = "foo";
       var arg_name = "foo";
@@ -743,9 +745,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -759,27 +763,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildProduct());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_parent, arg_name).then(unittest.expectAsync1(((api.Product response) {
+      res
+          .update(arg_request, arg_parent, arg_name)
+          .then(unittest.expectAsync1(((api.Product response) {
         checkProduct(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/mirror/v1_test.dart b/generated/googleapis/test/mirror/v1_test.dart
index 8490d9f..99457d6 100644
--- a/generated/googleapis/test/mirror/v1_test.dart
+++ b/generated/googleapis/test/mirror/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.mirror.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/mirror/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,46 +44,46 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1497() {
+buildUnnamed1488() {
   var o = new core.List<api.AuthToken>();
   o.add(buildAuthToken());
   o.add(buildAuthToken());
   return o;
 }
 
-checkUnnamed1497(core.List<api.AuthToken> o) {
+checkUnnamed1488(core.List<api.AuthToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthToken(o[0]);
   checkAuthToken(o[1]);
 }
 
-buildUnnamed1498() {
+buildUnnamed1489() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1498(core.List<core.String> o) {
+checkUnnamed1489(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1499() {
+buildUnnamed1490() {
   var o = new core.List<api.UserData>();
   o.add(buildUserData());
   o.add(buildUserData());
   return o;
 }
 
-checkUnnamed1499(core.List<api.UserData> o) {
+checkUnnamed1490(core.List<api.UserData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserData(o[0]);
   checkUserData(o[1]);
@@ -95,10 +94,10 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.authTokens = buildUnnamed1497();
-    o.features = buildUnnamed1498();
+    o.authTokens = buildUnnamed1488();
+    o.features = buildUnnamed1489();
     o.password = "foo";
-    o.userData = buildUnnamed1499();
+    o.userData = buildUnnamed1490();
   }
   buildCounterAccount--;
   return o;
@@ -107,10 +106,10 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed1497(o.authTokens);
-    checkUnnamed1498(o.features);
+    checkUnnamed1488(o.authTokens);
+    checkUnnamed1489(o.features);
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed1499(o.userData);
+    checkUnnamed1490(o.userData);
   }
   buildCounterAccount--;
 }
@@ -140,14 +139,14 @@
   buildCounterAttachment--;
 }
 
-buildUnnamed1500() {
+buildUnnamed1491() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed1500(core.List<api.Attachment> o) {
+checkUnnamed1491(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -158,7 +157,7 @@
   var o = new api.AttachmentsListResponse();
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    o.items = buildUnnamed1500();
+    o.items = buildUnnamed1491();
     o.kind = "foo";
   }
   buildCounterAttachmentsListResponse--;
@@ -168,7 +167,7 @@
 checkAttachmentsListResponse(api.AttachmentsListResponse o) {
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    checkUnnamed1500(o.items);
+    checkUnnamed1491(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAttachmentsListResponse--;
@@ -214,53 +213,53 @@
   buildCounterCommand--;
 }
 
-buildUnnamed1501() {
+buildUnnamed1492() {
   var o = new core.List<api.Command>();
   o.add(buildCommand());
   o.add(buildCommand());
   return o;
 }
 
-checkUnnamed1501(core.List<api.Command> o) {
+checkUnnamed1492(core.List<api.Command> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommand(o[0]);
   checkCommand(o[1]);
 }
 
-buildUnnamed1502() {
+buildUnnamed1493() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1502(core.List<core.String> o) {
+checkUnnamed1493(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1503() {
+buildUnnamed1494() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1503(core.List<core.String> o) {
+checkUnnamed1494(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1504() {
+buildUnnamed1495() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1504(core.List<core.String> o) {
+checkUnnamed1495(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -271,15 +270,15 @@
   var o = new api.Contact();
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    o.acceptCommands = buildUnnamed1501();
-    o.acceptTypes = buildUnnamed1502();
+    o.acceptCommands = buildUnnamed1492();
+    o.acceptTypes = buildUnnamed1493();
     o.displayName = "foo";
     o.id = "foo";
-    o.imageUrls = buildUnnamed1503();
+    o.imageUrls = buildUnnamed1494();
     o.kind = "foo";
     o.phoneNumber = "foo";
     o.priority = 42;
-    o.sharingFeatures = buildUnnamed1504();
+    o.sharingFeatures = buildUnnamed1495();
     o.source = "foo";
     o.speakableName = "foo";
     o.type = "foo";
@@ -291,15 +290,15 @@
 checkContact(api.Contact o) {
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    checkUnnamed1501(o.acceptCommands);
-    checkUnnamed1502(o.acceptTypes);
+    checkUnnamed1492(o.acceptCommands);
+    checkUnnamed1493(o.acceptTypes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1503(o.imageUrls);
+    checkUnnamed1494(o.imageUrls);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
-    checkUnnamed1504(o.sharingFeatures);
+    checkUnnamed1495(o.sharingFeatures);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.speakableName, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -307,14 +306,14 @@
   buildCounterContact--;
 }
 
-buildUnnamed1505() {
+buildUnnamed1496() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed1505(core.List<api.Contact> o) {
+checkUnnamed1496(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -325,7 +324,7 @@
   var o = new api.ContactsListResponse();
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    o.items = buildUnnamed1505();
+    o.items = buildUnnamed1496();
     o.kind = "foo";
   }
   buildCounterContactsListResponse--;
@@ -335,7 +334,7 @@
 checkContactsListResponse(api.ContactsListResponse o) {
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    checkUnnamed1505(o.items);
+    checkUnnamed1496(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterContactsListResponse--;
@@ -369,19 +368,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
     unittest.expect(o.longitude, unittest.equals(42.0));
-    unittest.expect(o.timestamp, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.timestamp,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterLocation--;
 }
 
-buildUnnamed1506() {
+buildUnnamed1497() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed1506(core.List<api.Location> o) {
+checkUnnamed1497(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -392,7 +392,7 @@
   var o = new api.LocationsListResponse();
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    o.items = buildUnnamed1506();
+    o.items = buildUnnamed1497();
     o.kind = "foo";
   }
   buildCounterLocationsListResponse--;
@@ -402,20 +402,20 @@
 checkLocationsListResponse(api.LocationsListResponse o) {
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    checkUnnamed1506(o.items);
+    checkUnnamed1497(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocationsListResponse--;
 }
 
-buildUnnamed1507() {
+buildUnnamed1498() {
   var o = new core.List<api.MenuValue>();
   o.add(buildMenuValue());
   o.add(buildMenuValue());
   return o;
 }
 
-checkUnnamed1507(core.List<api.MenuValue> o) {
+checkUnnamed1498(core.List<api.MenuValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuValue(o[0]);
   checkMenuValue(o[1]);
@@ -431,7 +431,7 @@
     o.id = "foo";
     o.payload = "foo";
     o.removeWhenSelected = true;
-    o.values = buildUnnamed1507();
+    o.values = buildUnnamed1498();
   }
   buildCounterMenuItem--;
   return o;
@@ -445,7 +445,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.removeWhenSelected, unittest.isTrue);
-    checkUnnamed1507(o.values);
+    checkUnnamed1498(o.values);
   }
   buildCounterMenuItem--;
 }
@@ -473,14 +473,14 @@
   buildCounterMenuValue--;
 }
 
-buildUnnamed1508() {
+buildUnnamed1499() {
   var o = new core.List<api.UserAction>();
   o.add(buildUserAction());
   o.add(buildUserAction());
   return o;
 }
 
-checkUnnamed1508(core.List<api.UserAction> o) {
+checkUnnamed1499(core.List<api.UserAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAction(o[0]);
   checkUserAction(o[1]);
@@ -494,7 +494,7 @@
     o.collection = "foo";
     o.itemId = "foo";
     o.operation = "foo";
-    o.userActions = buildUnnamed1508();
+    o.userActions = buildUnnamed1499();
     o.userToken = "foo";
     o.verifyToken = "foo";
   }
@@ -508,7 +508,7 @@
     unittest.expect(o.collection, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.operation, unittest.equals('foo'));
-    checkUnnamed1508(o.userActions);
+    checkUnnamed1499(o.userActions);
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
@@ -530,7 +530,8 @@
 checkNotificationConfig(api.NotificationConfig o) {
   buildCounterNotificationConfig++;
   if (buildCounterNotificationConfig < 3) {
-    unittest.expect(o.deliveryTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.deliveryTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.level, unittest.equals('foo'));
   }
   buildCounterNotificationConfig--;
@@ -559,14 +560,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed1509() {
+buildUnnamed1500() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1509(core.List<core.String> o) {
+checkUnnamed1500(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -582,7 +583,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.notification = buildNotification();
-    o.operation = buildUnnamed1509();
+    o.operation = buildUnnamed1500();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.userToken = "foo";
     o.verifyToken = "foo";
@@ -599,22 +600,23 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNotification(o.notification);
-    checkUnnamed1509(o.operation);
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed1500(o.operation);
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
   buildCounterSubscription--;
 }
 
-buildUnnamed1510() {
+buildUnnamed1501() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1510(core.List<api.Subscription> o) {
+checkUnnamed1501(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -625,7 +627,7 @@
   var o = new api.SubscriptionsListResponse();
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    o.items = buildUnnamed1510();
+    o.items = buildUnnamed1501();
     o.kind = "foo";
   }
   buildCounterSubscriptionsListResponse--;
@@ -635,46 +637,46 @@
 checkSubscriptionsListResponse(api.SubscriptionsListResponse o) {
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    checkUnnamed1510(o.items);
+    checkUnnamed1501(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSubscriptionsListResponse--;
 }
 
-buildUnnamed1511() {
+buildUnnamed1502() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed1511(core.List<api.Attachment> o) {
+checkUnnamed1502(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
 }
 
-buildUnnamed1512() {
+buildUnnamed1503() {
   var o = new core.List<api.MenuItem>();
   o.add(buildMenuItem());
   o.add(buildMenuItem());
   return o;
 }
 
-checkUnnamed1512(core.List<api.MenuItem> o) {
+checkUnnamed1503(core.List<api.MenuItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuItem(o[0]);
   checkMenuItem(o[1]);
 }
 
-buildUnnamed1513() {
+buildUnnamed1504() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed1513(core.List<api.Contact> o) {
+checkUnnamed1504(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -685,7 +687,7 @@
   var o = new api.TimelineItem();
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    o.attachments = buildUnnamed1511();
+    o.attachments = buildUnnamed1502();
     o.bundleId = "foo";
     o.canonicalUrl = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -700,10 +702,10 @@
     o.isPinned = true;
     o.kind = "foo";
     o.location = buildLocation();
-    o.menuItems = buildUnnamed1512();
+    o.menuItems = buildUnnamed1503();
     o.notification = buildNotificationConfig();
     o.pinScore = 42;
-    o.recipients = buildUnnamed1513();
+    o.recipients = buildUnnamed1504();
     o.selfLink = "foo";
     o.sourceItemId = "foo";
     o.speakableText = "foo";
@@ -719,12 +721,14 @@
 checkTimelineItem(api.TimelineItem o) {
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    checkUnnamed1511(o.attachments);
+    checkUnnamed1502(o.attachments);
     unittest.expect(o.bundleId, unittest.equals('foo'));
     unittest.expect(o.canonicalUrl, unittest.equals('foo'));
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkContact(o.creator);
-    unittest.expect(o.displayTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.displayTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.html, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -734,29 +738,30 @@
     unittest.expect(o.isPinned, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed1512(o.menuItems);
+    checkUnnamed1503(o.menuItems);
     checkNotificationConfig(o.notification);
     unittest.expect(o.pinScore, unittest.equals(42));
-    checkUnnamed1513(o.recipients);
+    checkUnnamed1504(o.recipients);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceItemId, unittest.equals('foo'));
     unittest.expect(o.speakableText, unittest.equals('foo'));
     unittest.expect(o.speakableType, unittest.equals('foo'));
     unittest.expect(o.text, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterTimelineItem--;
 }
 
-buildUnnamed1514() {
+buildUnnamed1505() {
   var o = new core.List<api.TimelineItem>();
   o.add(buildTimelineItem());
   o.add(buildTimelineItem());
   return o;
 }
 
-checkUnnamed1514(core.List<api.TimelineItem> o) {
+checkUnnamed1505(core.List<api.TimelineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimelineItem(o[0]);
   checkTimelineItem(o[1]);
@@ -767,7 +772,7 @@
   var o = new api.TimelineListResponse();
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    o.items = buildUnnamed1514();
+    o.items = buildUnnamed1505();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -778,7 +783,7 @@
 checkTimelineListResponse(api.TimelineListResponse o) {
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    checkUnnamed1514(o.items);
+    checkUnnamed1505(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -827,7 +832,6 @@
   buildCounterUserData--;
 }
 
-
 main() {
   unittest.group("obj-schema-Account", () {
     unittest.test("to-json--from-json", () {
@@ -837,7 +841,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Attachment", () {
     unittest.test("to-json--from-json", () {
       var o = buildAttachment();
@@ -846,7 +849,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AttachmentsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAttachmentsListResponse();
@@ -855,7 +857,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthToken", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthToken();
@@ -864,7 +865,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Command", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommand();
@@ -873,7 +873,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Contact", () {
     unittest.test("to-json--from-json", () {
       var o = buildContact();
@@ -882,7 +881,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ContactsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildContactsListResponse();
@@ -891,7 +889,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Location", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocation();
@@ -900,7 +897,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocationsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocationsListResponse();
@@ -909,7 +905,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MenuItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildMenuItem();
@@ -918,7 +913,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MenuValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildMenuValue();
@@ -927,7 +921,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Notification", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotification();
@@ -936,7 +929,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NotificationConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotificationConfig();
@@ -945,7 +937,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Setting", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetting();
@@ -954,7 +945,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Subscription", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscription();
@@ -963,7 +953,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionsListResponse();
@@ -972,7 +961,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TimelineItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimelineItem();
@@ -981,7 +969,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TimelineListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimelineListResponse();
@@ -990,7 +977,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserAction", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserAction();
@@ -999,7 +985,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UserData", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserData();
@@ -1008,10 +993,8 @@
     });
   });
 
-
   unittest.group("resource-AccountsResourceApi", () {
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.AccountsResourceApi res = new api.MirrorApi(mock).accounts;
       var arg_request = buildAccount();
@@ -1026,25 +1009,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userToken"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
         index = path.indexOf("/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_accountType"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1060,31 +1050,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAccount());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_userToken, arg_accountType, arg_accountName).then(unittest.expectAsync1(((api.Account response) {
+      res
+          .insert(arg_request, arg_userToken, arg_accountType, arg_accountName)
+          .then(unittest.expectAsync1(((api.Account response) {
         checkAccount(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ContactsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ContactsResourceApi res = new api.MirrorApi(mock).contacts;
       var arg_id = "foo";
@@ -1093,11 +1083,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1113,16 +1106,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1131,7 +1125,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ContactsResourceApi res = new api.MirrorApi(mock).contacts;
       var arg_id = "foo";
@@ -1140,11 +1133,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1160,16 +1156,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildContact());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1180,7 +1177,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ContactsResourceApi res = new api.MirrorApi(mock).contacts;
       var arg_request = buildContact();
@@ -1192,11 +1188,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("contacts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("contacts"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1209,27 +1208,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildContact());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.Contact response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.Contact response) {
         checkContact(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ContactsResourceApi res = new api.MirrorApi(mock).contacts;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1237,11 +1238,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("contacts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("contacts"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1254,27 +1258,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildContactsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list().then(unittest.expectAsync1(((api.ContactsListResponse response) {
+      res
+          .list()
+          .then(unittest.expectAsync1(((api.ContactsListResponse response) {
         checkContactsListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.ContactsResourceApi res = new api.MirrorApi(mock).contacts;
       var arg_request = buildContact();
@@ -1287,11 +1293,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1307,27 +1316,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildContact());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_id).then(unittest.expectAsync1(((api.Contact response) {
+      res
+          .patch(arg_request, arg_id)
+          .then(unittest.expectAsync1(((api.Contact response) {
         checkContact(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.ContactsResourceApi res = new api.MirrorApi(mock).contacts;
       var arg_request = buildContact();
@@ -1340,11 +1351,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1360,31 +1374,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildContact());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_id).then(unittest.expectAsync1(((api.Contact response) {
+      res
+          .update(arg_request, arg_id)
+          .then(unittest.expectAsync1(((api.Contact response) {
         checkContact(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LocationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.LocationsResourceApi res = new api.MirrorApi(mock).locations;
       var arg_id = "foo";
@@ -1393,11 +1407,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("locations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("locations/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1413,16 +1430,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLocation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1433,7 +1451,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.LocationsResourceApi res = new api.MirrorApi(mock).locations;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1441,11 +1458,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("locations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("locations"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1458,31 +1478,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLocationsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list().then(unittest.expectAsync1(((api.LocationsListResponse response) {
+      res
+          .list()
+          .then(unittest.expectAsync1(((api.LocationsListResponse response) {
         checkLocationsListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SettingsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SettingsResourceApi res = new api.MirrorApi(mock).settings;
       var arg_id = "foo";
@@ -1491,11 +1511,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("settings/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("settings/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1511,16 +1534,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSetting());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1529,13 +1553,10 @@
         checkSetting(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SubscriptionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.MirrorApi(mock).subscriptions;
       var arg_id = "foo";
@@ -1544,11 +1565,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("subscriptions/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1564,16 +1588,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1582,7 +1607,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.MirrorApi(mock).subscriptions;
       var arg_request = buildSubscription();
@@ -1594,11 +1618,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("subscriptions"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1611,27 +1638,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.MirrorApi(mock).subscriptions;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1639,11 +1668,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("subscriptions"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1656,27 +1688,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscriptionsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list().then(unittest.expectAsync1(((api.SubscriptionsListResponse response) {
+      res.list().then(
+          unittest.expectAsync1(((api.SubscriptionsListResponse response) {
         checkSubscriptionsListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.MirrorApi(mock).subscriptions;
       var arg_request = buildSubscription();
@@ -1689,11 +1722,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("subscriptions/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1709,31 +1745,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_id).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .update(arg_request, arg_id)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TimelineResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TimelineResourceApi res = new api.MirrorApi(mock).timeline;
       var arg_id = "foo";
@@ -1742,11 +1778,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1762,16 +1801,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1780,7 +1820,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TimelineResourceApi res = new api.MirrorApi(mock).timeline;
       var arg_id = "foo";
@@ -1789,11 +1828,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1809,16 +1851,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTimelineItem());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1843,11 +1886,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("timeline"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("timeline"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1860,27 +1906,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTimelineItem());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.TimelineItem response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.TimelineItem response) {
         checkTimelineItem(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TimelineResourceApi res = new api.MirrorApi(mock).timeline;
       var arg_bundleId = "foo";
@@ -1895,11 +1943,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("timeline"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("timeline"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1912,34 +1963,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["bundleId"].first, unittest.equals(arg_bundleId));
-        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["pinnedOnly"].first, unittest.equals("$arg_pinnedOnly"));
-        unittest.expect(queryMap["sourceItemId"].first, unittest.equals(arg_sourceItemId));
-
+        unittest.expect(
+            queryMap["bundleId"].first, unittest.equals(arg_bundleId));
+        unittest.expect(queryMap["includeDeleted"].first,
+            unittest.equals("$arg_includeDeleted"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["pinnedOnly"].first, unittest.equals("$arg_pinnedOnly"));
+        unittest.expect(
+            queryMap["sourceItemId"].first, unittest.equals(arg_sourceItemId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTimelineListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(bundleId: arg_bundleId, includeDeleted: arg_includeDeleted, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, pinnedOnly: arg_pinnedOnly, sourceItemId: arg_sourceItemId).then(unittest.expectAsync1(((api.TimelineListResponse response) {
+      res
+          .list(
+              bundleId: arg_bundleId,
+              includeDeleted: arg_includeDeleted,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken,
+              pinnedOnly: arg_pinnedOnly,
+              sourceItemId: arg_sourceItemId)
+          .then(unittest.expectAsync1(((api.TimelineListResponse response) {
         checkTimelineListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TimelineResourceApi res = new api.MirrorApi(mock).timeline;
       var arg_request = buildTimelineItem();
@@ -1952,11 +2019,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1972,21 +2042,24 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTimelineItem());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_id).then(unittest.expectAsync1(((api.TimelineItem response) {
+      res
+          .patch(arg_request, arg_id)
+          .then(unittest.expectAsync1(((api.TimelineItem response) {
         checkTimelineItem(response);
       })));
     });
@@ -2007,11 +2080,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2027,33 +2103,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTimelineItem());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_id).then(unittest.expectAsync1(((api.TimelineItem response) {
+      res
+          .update(arg_request, arg_id)
+          .then(unittest.expectAsync1(((api.TimelineItem response) {
         checkTimelineItem(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TimelineAttachmentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TimelineAttachmentsResourceApi res = new api.MirrorApi(mock).timeline.attachments;
+      api.TimelineAttachmentsResourceApi res =
+          new api.MirrorApi(mock).timeline.attachments;
       var arg_itemId = "foo";
       var arg_attachmentId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2061,18 +2138,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_itemId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/attachments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/attachments/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2088,21 +2170,24 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_itemId, arg_attachmentId).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_itemId, arg_attachmentId)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
@@ -2110,7 +2195,8 @@
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.TimelineAttachmentsResourceApi res = new api.MirrorApi(mock).timeline.attachments;
+      api.TimelineAttachmentsResourceApi res =
+          new api.MirrorApi(mock).timeline.attachments;
       var arg_itemId = "foo";
       var arg_attachmentId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2118,18 +2204,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_itemId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/attachments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("/attachments/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2145,21 +2236,24 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAttachment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_itemId, arg_attachmentId).then(unittest.expectAsync1(((api.Attachment response) {
+      res
+          .get(arg_itemId, arg_attachmentId)
+          .then(unittest.expectAsync1(((api.Attachment response) {
         checkAttachment(response);
       })));
     });
@@ -2169,25 +2263,31 @@
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.TimelineAttachmentsResourceApi res = new api.MirrorApi(mock).timeline.attachments;
+      api.TimelineAttachmentsResourceApi res =
+          new api.MirrorApi(mock).timeline.attachments;
       var arg_itemId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_itemId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/attachments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/attachments"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -2200,47 +2300,55 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAttachment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_itemId).then(unittest.expectAsync1(((api.Attachment response) {
+      res
+          .insert(arg_itemId)
+          .then(unittest.expectAsync1(((api.Attachment response) {
         checkAttachment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TimelineAttachmentsResourceApi res = new api.MirrorApi(mock).timeline.attachments;
+      api.TimelineAttachmentsResourceApi res =
+          new api.MirrorApi(mock).timeline.attachments;
       var arg_itemId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("mirror/v1/"));
         pathOffset += 10;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_itemId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/attachments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/attachments"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -2253,27 +2361,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAttachmentsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_itemId).then(unittest.expectAsync1(((api.AttachmentsListResponse response) {
+      res
+          .list(arg_itemId)
+          .then(unittest.expectAsync1(((api.AttachmentsListResponse response) {
         checkAttachmentsListResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/ml/v1_test.dart b/generated/googleapis/test/ml/v1_test.dart
index af03412..04b3a15 100644
--- a/generated/googleapis/test/ml/v1_test.dart
+++ b/generated/googleapis/test/ml/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.ml.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/ml/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,23 +44,39 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
 buildUnnamed0() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
 checkUnnamed0(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 buildUnnamed1() {
@@ -100,7 +115,8 @@
   buildCounterGoogleApiHttpBody--;
 }
 
-core.int buildCounterGoogleCloudMlV1HyperparameterOutputHyperparameterMetric = 0;
+core.int buildCounterGoogleCloudMlV1HyperparameterOutputHyperparameterMetric =
+    0;
 buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric() {
   var o = new api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
   buildCounterGoogleCloudMlV1HyperparameterOutputHyperparameterMetric++;
@@ -112,7 +128,8 @@
   return o;
 }
 
-checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric o) {
+checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(
+    api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric o) {
   buildCounterGoogleCloudMlV1HyperparameterOutputHyperparameterMetric++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutputHyperparameterMetric < 3) {
     unittest.expect(o.objectiveValue, unittest.equals(42.0));
@@ -144,16 +161,14 @@
 buildGoogleCloudMlV1CancelJobRequest() {
   var o = new api.GoogleCloudMlV1CancelJobRequest();
   buildCounterGoogleCloudMlV1CancelJobRequest++;
-  if (buildCounterGoogleCloudMlV1CancelJobRequest < 3) {
-  }
+  if (buildCounterGoogleCloudMlV1CancelJobRequest < 3) {}
   buildCounterGoogleCloudMlV1CancelJobRequest--;
   return o;
 }
 
 checkGoogleCloudMlV1CancelJobRequest(api.GoogleCloudMlV1CancelJobRequest o) {
   buildCounterGoogleCloudMlV1CancelJobRequest++;
-  if (buildCounterGoogleCloudMlV1CancelJobRequest < 3) {
-  }
+  if (buildCounterGoogleCloudMlV1CancelJobRequest < 3) {}
   buildCounterGoogleCloudMlV1CancelJobRequest--;
 }
 
@@ -179,13 +194,15 @@
 }
 
 buildUnnamed2() {
-  var o = new core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric>();
+  var o = new core
+      .List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric>();
   o.add(buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric());
   o.add(buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric());
   return o;
 }
 
-checkUnnamed2(core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric> o) {
+checkUnnamed2(
+    core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o[0]);
   checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o[1]);
@@ -210,7 +227,8 @@
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
     o.allMetrics = buildUnnamed2();
-    o.finalMetric = buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
+    o.finalMetric =
+        buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
     o.hyperparameters = buildUnnamed3();
     o.trialId = "foo";
   }
@@ -218,7 +236,8 @@
   return o;
 }
 
-checkGoogleCloudMlV1HyperparameterOutput(api.GoogleCloudMlV1HyperparameterOutput o) {
+checkGoogleCloudMlV1HyperparameterOutput(
+    api.GoogleCloudMlV1HyperparameterOutput o) {
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
     checkUnnamed2(o.allMetrics);
@@ -257,7 +276,8 @@
   return o;
 }
 
-checkGoogleCloudMlV1HyperparameterSpec(api.GoogleCloudMlV1HyperparameterSpec o) {
+checkGoogleCloudMlV1HyperparameterSpec(
+    api.GoogleCloudMlV1HyperparameterSpec o) {
   buildCounterGoogleCloudMlV1HyperparameterSpec++;
   if (buildCounterGoogleCloudMlV1HyperparameterSpec < 3) {
     unittest.expect(o.goal, unittest.equals('foo'));
@@ -365,7 +385,8 @@
   return o;
 }
 
-checkGoogleCloudMlV1ListModelsResponse(api.GoogleCloudMlV1ListModelsResponse o) {
+checkGoogleCloudMlV1ListModelsResponse(
+    api.GoogleCloudMlV1ListModelsResponse o) {
   buildCounterGoogleCloudMlV1ListModelsResponse++;
   if (buildCounterGoogleCloudMlV1ListModelsResponse < 3) {
     checkUnnamed6(o.models);
@@ -399,7 +420,8 @@
   return o;
 }
 
-checkGoogleCloudMlV1ListVersionsResponse(api.GoogleCloudMlV1ListVersionsResponse o) {
+checkGoogleCloudMlV1ListVersionsResponse(
+    api.GoogleCloudMlV1ListVersionsResponse o) {
   buildCounterGoogleCloudMlV1ListVersionsResponse++;
   if (buildCounterGoogleCloudMlV1ListVersionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -653,16 +675,15 @@
 buildGoogleCloudMlV1SetDefaultVersionRequest() {
   var o = new api.GoogleCloudMlV1SetDefaultVersionRequest();
   buildCounterGoogleCloudMlV1SetDefaultVersionRequest++;
-  if (buildCounterGoogleCloudMlV1SetDefaultVersionRequest < 3) {
-  }
+  if (buildCounterGoogleCloudMlV1SetDefaultVersionRequest < 3) {}
   buildCounterGoogleCloudMlV1SetDefaultVersionRequest--;
   return o;
 }
 
-checkGoogleCloudMlV1SetDefaultVersionRequest(api.GoogleCloudMlV1SetDefaultVersionRequest o) {
+checkGoogleCloudMlV1SetDefaultVersionRequest(
+    api.GoogleCloudMlV1SetDefaultVersionRequest o) {
   buildCounterGoogleCloudMlV1SetDefaultVersionRequest++;
-  if (buildCounterGoogleCloudMlV1SetDefaultVersionRequest < 3) {
-  }
+  if (buildCounterGoogleCloudMlV1SetDefaultVersionRequest < 3) {}
   buildCounterGoogleCloudMlV1SetDefaultVersionRequest--;
 }
 
@@ -812,173 +833,6 @@
   buildCounterGoogleCloudMlV1Version--;
 }
 
-core.int buildCounterGoogleCloudMlV1beta1AutoScaling = 0;
-buildGoogleCloudMlV1beta1AutoScaling() {
-  var o = new api.GoogleCloudMlV1beta1AutoScaling();
-  buildCounterGoogleCloudMlV1beta1AutoScaling++;
-  if (buildCounterGoogleCloudMlV1beta1AutoScaling < 3) {
-    o.minNodes = 42;
-  }
-  buildCounterGoogleCloudMlV1beta1AutoScaling--;
-  return o;
-}
-
-checkGoogleCloudMlV1beta1AutoScaling(api.GoogleCloudMlV1beta1AutoScaling o) {
-  buildCounterGoogleCloudMlV1beta1AutoScaling++;
-  if (buildCounterGoogleCloudMlV1beta1AutoScaling < 3) {
-    unittest.expect(o.minNodes, unittest.equals(42));
-  }
-  buildCounterGoogleCloudMlV1beta1AutoScaling--;
-}
-
-core.int buildCounterGoogleCloudMlV1beta1ManualScaling = 0;
-buildGoogleCloudMlV1beta1ManualScaling() {
-  var o = new api.GoogleCloudMlV1beta1ManualScaling();
-  buildCounterGoogleCloudMlV1beta1ManualScaling++;
-  if (buildCounterGoogleCloudMlV1beta1ManualScaling < 3) {
-    o.nodes = 42;
-  }
-  buildCounterGoogleCloudMlV1beta1ManualScaling--;
-  return o;
-}
-
-checkGoogleCloudMlV1beta1ManualScaling(api.GoogleCloudMlV1beta1ManualScaling o) {
-  buildCounterGoogleCloudMlV1beta1ManualScaling++;
-  if (buildCounterGoogleCloudMlV1beta1ManualScaling < 3) {
-    unittest.expect(o.nodes, unittest.equals(42));
-  }
-  buildCounterGoogleCloudMlV1beta1ManualScaling--;
-}
-
-core.int buildCounterGoogleCloudMlV1beta1OperationMetadata = 0;
-buildGoogleCloudMlV1beta1OperationMetadata() {
-  var o = new api.GoogleCloudMlV1beta1OperationMetadata();
-  buildCounterGoogleCloudMlV1beta1OperationMetadata++;
-  if (buildCounterGoogleCloudMlV1beta1OperationMetadata < 3) {
-    o.createTime = "foo";
-    o.endTime = "foo";
-    o.isCancellationRequested = true;
-    o.modelName = "foo";
-    o.operationType = "foo";
-    o.startTime = "foo";
-    o.version = buildGoogleCloudMlV1beta1Version();
-  }
-  buildCounterGoogleCloudMlV1beta1OperationMetadata--;
-  return o;
-}
-
-checkGoogleCloudMlV1beta1OperationMetadata(api.GoogleCloudMlV1beta1OperationMetadata o) {
-  buildCounterGoogleCloudMlV1beta1OperationMetadata++;
-  if (buildCounterGoogleCloudMlV1beta1OperationMetadata < 3) {
-    unittest.expect(o.createTime, unittest.equals('foo'));
-    unittest.expect(o.endTime, unittest.equals('foo'));
-    unittest.expect(o.isCancellationRequested, unittest.isTrue);
-    unittest.expect(o.modelName, unittest.equals('foo'));
-    unittest.expect(o.operationType, unittest.equals('foo'));
-    unittest.expect(o.startTime, unittest.equals('foo'));
-    checkGoogleCloudMlV1beta1Version(o.version);
-  }
-  buildCounterGoogleCloudMlV1beta1OperationMetadata--;
-}
-
-core.int buildCounterGoogleCloudMlV1beta1Version = 0;
-buildGoogleCloudMlV1beta1Version() {
-  var o = new api.GoogleCloudMlV1beta1Version();
-  buildCounterGoogleCloudMlV1beta1Version++;
-  if (buildCounterGoogleCloudMlV1beta1Version < 3) {
-    o.autoScaling = buildGoogleCloudMlV1beta1AutoScaling();
-    o.createTime = "foo";
-    o.deploymentUri = "foo";
-    o.description = "foo";
-    o.errorMessage = "foo";
-    o.isDefault = true;
-    o.lastUseTime = "foo";
-    o.manualScaling = buildGoogleCloudMlV1beta1ManualScaling();
-    o.name = "foo";
-    o.runtimeVersion = "foo";
-    o.state = "foo";
-  }
-  buildCounterGoogleCloudMlV1beta1Version--;
-  return o;
-}
-
-checkGoogleCloudMlV1beta1Version(api.GoogleCloudMlV1beta1Version o) {
-  buildCounterGoogleCloudMlV1beta1Version++;
-  if (buildCounterGoogleCloudMlV1beta1Version < 3) {
-    checkGoogleCloudMlV1beta1AutoScaling(o.autoScaling);
-    unittest.expect(o.createTime, unittest.equals('foo'));
-    unittest.expect(o.deploymentUri, unittest.equals('foo'));
-    unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.errorMessage, unittest.equals('foo'));
-    unittest.expect(o.isDefault, unittest.isTrue);
-    unittest.expect(o.lastUseTime, unittest.equals('foo'));
-    checkGoogleCloudMlV1beta1ManualScaling(o.manualScaling);
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.runtimeVersion, unittest.equals('foo'));
-    unittest.expect(o.state, unittest.equals('foo'));
-  }
-  buildCounterGoogleCloudMlV1beta1Version--;
-}
-
-core.int buildCounterGoogleIamV1LogConfigCloudAuditOptions = 0;
-buildGoogleIamV1LogConfigCloudAuditOptions() {
-  var o = new api.GoogleIamV1LogConfigCloudAuditOptions();
-  buildCounterGoogleIamV1LogConfigCloudAuditOptions++;
-  if (buildCounterGoogleIamV1LogConfigCloudAuditOptions < 3) {
-    o.logName = "foo";
-  }
-  buildCounterGoogleIamV1LogConfigCloudAuditOptions--;
-  return o;
-}
-
-checkGoogleIamV1LogConfigCloudAuditOptions(api.GoogleIamV1LogConfigCloudAuditOptions o) {
-  buildCounterGoogleIamV1LogConfigCloudAuditOptions++;
-  if (buildCounterGoogleIamV1LogConfigCloudAuditOptions < 3) {
-    unittest.expect(o.logName, unittest.equals('foo'));
-  }
-  buildCounterGoogleIamV1LogConfigCloudAuditOptions--;
-}
-
-core.int buildCounterGoogleIamV1LogConfigCounterOptions = 0;
-buildGoogleIamV1LogConfigCounterOptions() {
-  var o = new api.GoogleIamV1LogConfigCounterOptions();
-  buildCounterGoogleIamV1LogConfigCounterOptions++;
-  if (buildCounterGoogleIamV1LogConfigCounterOptions < 3) {
-    o.field = "foo";
-    o.metric = "foo";
-  }
-  buildCounterGoogleIamV1LogConfigCounterOptions--;
-  return o;
-}
-
-checkGoogleIamV1LogConfigCounterOptions(api.GoogleIamV1LogConfigCounterOptions o) {
-  buildCounterGoogleIamV1LogConfigCounterOptions++;
-  if (buildCounterGoogleIamV1LogConfigCounterOptions < 3) {
-    unittest.expect(o.field, unittest.equals('foo'));
-    unittest.expect(o.metric, unittest.equals('foo'));
-  }
-  buildCounterGoogleIamV1LogConfigCounterOptions--;
-}
-
-core.int buildCounterGoogleIamV1LogConfigDataAccessOptions = 0;
-buildGoogleIamV1LogConfigDataAccessOptions() {
-  var o = new api.GoogleIamV1LogConfigDataAccessOptions();
-  buildCounterGoogleIamV1LogConfigDataAccessOptions++;
-  if (buildCounterGoogleIamV1LogConfigDataAccessOptions < 3) {
-    o.logMode = "foo";
-  }
-  buildCounterGoogleIamV1LogConfigDataAccessOptions--;
-  return o;
-}
-
-checkGoogleIamV1LogConfigDataAccessOptions(api.GoogleIamV1LogConfigDataAccessOptions o) {
-  buildCounterGoogleIamV1LogConfigDataAccessOptions++;
-  if (buildCounterGoogleIamV1LogConfigDataAccessOptions < 3) {
-    unittest.expect(o.logMode, unittest.equals('foo'));
-  }
-  buildCounterGoogleIamV1LogConfigDataAccessOptions--;
-}
-
 buildUnnamed15() {
   var o = new core.List<api.GoogleIamV1AuditLogConfig>();
   o.add(buildGoogleIamV1AuditLogConfig());
@@ -1099,119 +953,40 @@
 }
 
 buildUnnamed19() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed19(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterGoogleIamV1Condition = 0;
-buildGoogleIamV1Condition() {
-  var o = new api.GoogleIamV1Condition();
-  buildCounterGoogleIamV1Condition++;
-  if (buildCounterGoogleIamV1Condition < 3) {
-    o.iam = "foo";
-    o.op = "foo";
-    o.svc = "foo";
-    o.sys = "foo";
-    o.value = "foo";
-    o.values = buildUnnamed19();
-  }
-  buildCounterGoogleIamV1Condition--;
-  return o;
-}
-
-checkGoogleIamV1Condition(api.GoogleIamV1Condition o) {
-  buildCounterGoogleIamV1Condition++;
-  if (buildCounterGoogleIamV1Condition < 3) {
-    unittest.expect(o.iam, unittest.equals('foo'));
-    unittest.expect(o.op, unittest.equals('foo'));
-    unittest.expect(o.svc, unittest.equals('foo'));
-    unittest.expect(o.sys, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed19(o.values);
-  }
-  buildCounterGoogleIamV1Condition--;
-}
-
-core.int buildCounterGoogleIamV1LogConfig = 0;
-buildGoogleIamV1LogConfig() {
-  var o = new api.GoogleIamV1LogConfig();
-  buildCounterGoogleIamV1LogConfig++;
-  if (buildCounterGoogleIamV1LogConfig < 3) {
-    o.cloudAudit = buildGoogleIamV1LogConfigCloudAuditOptions();
-    o.counter = buildGoogleIamV1LogConfigCounterOptions();
-    o.dataAccess = buildGoogleIamV1LogConfigDataAccessOptions();
-  }
-  buildCounterGoogleIamV1LogConfig--;
-  return o;
-}
-
-checkGoogleIamV1LogConfig(api.GoogleIamV1LogConfig o) {
-  buildCounterGoogleIamV1LogConfig++;
-  if (buildCounterGoogleIamV1LogConfig < 3) {
-    checkGoogleIamV1LogConfigCloudAuditOptions(o.cloudAudit);
-    checkGoogleIamV1LogConfigCounterOptions(o.counter);
-    checkGoogleIamV1LogConfigDataAccessOptions(o.dataAccess);
-  }
-  buildCounterGoogleIamV1LogConfig--;
-}
-
-buildUnnamed20() {
   var o = new core.List<api.GoogleIamV1AuditConfig>();
   o.add(buildGoogleIamV1AuditConfig());
   o.add(buildGoogleIamV1AuditConfig());
   return o;
 }
 
-checkUnnamed20(core.List<api.GoogleIamV1AuditConfig> o) {
+checkUnnamed19(core.List<api.GoogleIamV1AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1AuditConfig(o[0]);
   checkGoogleIamV1AuditConfig(o[1]);
 }
 
-buildUnnamed21() {
+buildUnnamed20() {
   var o = new core.List<api.GoogleIamV1Binding>();
   o.add(buildGoogleIamV1Binding());
   o.add(buildGoogleIamV1Binding());
   return o;
 }
 
-checkUnnamed21(core.List<api.GoogleIamV1Binding> o) {
+checkUnnamed20(core.List<api.GoogleIamV1Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1Binding(o[0]);
   checkGoogleIamV1Binding(o[1]);
 }
 
-buildUnnamed22() {
-  var o = new core.List<api.GoogleIamV1Rule>();
-  o.add(buildGoogleIamV1Rule());
-  o.add(buildGoogleIamV1Rule());
-  return o;
-}
-
-checkUnnamed22(core.List<api.GoogleIamV1Rule> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1Rule(o[0]);
-  checkGoogleIamV1Rule(o[1]);
-}
-
 core.int buildCounterGoogleIamV1Policy = 0;
 buildGoogleIamV1Policy() {
   var o = new api.GoogleIamV1Policy();
   buildCounterGoogleIamV1Policy++;
   if (buildCounterGoogleIamV1Policy < 3) {
-    o.auditConfigs = buildUnnamed20();
-    o.bindings = buildUnnamed21();
+    o.auditConfigs = buildUnnamed19();
+    o.bindings = buildUnnamed20();
     o.etag = "foo";
     o.iamOwned = true;
-    o.rules = buildUnnamed22();
     o.version = 42;
   }
   buildCounterGoogleIamV1Policy--;
@@ -1221,112 +996,15 @@
 checkGoogleIamV1Policy(api.GoogleIamV1Policy o) {
   buildCounterGoogleIamV1Policy++;
   if (buildCounterGoogleIamV1Policy < 3) {
-    checkUnnamed20(o.auditConfigs);
-    checkUnnamed21(o.bindings);
+    checkUnnamed19(o.auditConfigs);
+    checkUnnamed20(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed22(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterGoogleIamV1Policy--;
 }
 
-buildUnnamed23() {
-  var o = new core.List<api.GoogleIamV1Condition>();
-  o.add(buildGoogleIamV1Condition());
-  o.add(buildGoogleIamV1Condition());
-  return o;
-}
-
-checkUnnamed23(core.List<api.GoogleIamV1Condition> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1Condition(o[0]);
-  checkGoogleIamV1Condition(o[1]);
-}
-
-buildUnnamed24() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed24(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed25() {
-  var o = new core.List<api.GoogleIamV1LogConfig>();
-  o.add(buildGoogleIamV1LogConfig());
-  o.add(buildGoogleIamV1LogConfig());
-  return o;
-}
-
-checkUnnamed25(core.List<api.GoogleIamV1LogConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1LogConfig(o[0]);
-  checkGoogleIamV1LogConfig(o[1]);
-}
-
-buildUnnamed26() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed26(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed27() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed27(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterGoogleIamV1Rule = 0;
-buildGoogleIamV1Rule() {
-  var o = new api.GoogleIamV1Rule();
-  buildCounterGoogleIamV1Rule++;
-  if (buildCounterGoogleIamV1Rule < 3) {
-    o.action = "foo";
-    o.conditions = buildUnnamed23();
-    o.description = "foo";
-    o.in_ = buildUnnamed24();
-    o.logConfig = buildUnnamed25();
-    o.notIn = buildUnnamed26();
-    o.permissions = buildUnnamed27();
-  }
-  buildCounterGoogleIamV1Rule--;
-  return o;
-}
-
-checkGoogleIamV1Rule(api.GoogleIamV1Rule o) {
-  buildCounterGoogleIamV1Rule++;
-  if (buildCounterGoogleIamV1Rule < 3) {
-    unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed23(o.conditions);
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed24(o.in_);
-    checkUnnamed25(o.logConfig);
-    checkUnnamed26(o.notIn);
-    checkUnnamed27(o.permissions);
-  }
-  buildCounterGoogleIamV1Rule--;
-}
-
 core.int buildCounterGoogleIamV1SetIamPolicyRequest = 0;
 buildGoogleIamV1SetIamPolicyRequest() {
   var o = new api.GoogleIamV1SetIamPolicyRequest();
@@ -1348,14 +1026,14 @@
   buildCounterGoogleIamV1SetIamPolicyRequest--;
 }
 
-buildUnnamed28() {
+buildUnnamed21() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed28(core.List<core.String> o) {
+checkUnnamed21(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1366,28 +1044,29 @@
   var o = new api.GoogleIamV1TestIamPermissionsRequest();
   buildCounterGoogleIamV1TestIamPermissionsRequest++;
   if (buildCounterGoogleIamV1TestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed28();
+    o.permissions = buildUnnamed21();
   }
   buildCounterGoogleIamV1TestIamPermissionsRequest--;
   return o;
 }
 
-checkGoogleIamV1TestIamPermissionsRequest(api.GoogleIamV1TestIamPermissionsRequest o) {
+checkGoogleIamV1TestIamPermissionsRequest(
+    api.GoogleIamV1TestIamPermissionsRequest o) {
   buildCounterGoogleIamV1TestIamPermissionsRequest++;
   if (buildCounterGoogleIamV1TestIamPermissionsRequest < 3) {
-    checkUnnamed28(o.permissions);
+    checkUnnamed21(o.permissions);
   }
   buildCounterGoogleIamV1TestIamPermissionsRequest--;
 }
 
-buildUnnamed29() {
+buildUnnamed22() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed29(core.List<core.String> o) {
+checkUnnamed22(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1398,28 +1077,29 @@
   var o = new api.GoogleIamV1TestIamPermissionsResponse();
   buildCounterGoogleIamV1TestIamPermissionsResponse++;
   if (buildCounterGoogleIamV1TestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed29();
+    o.permissions = buildUnnamed22();
   }
   buildCounterGoogleIamV1TestIamPermissionsResponse--;
   return o;
 }
 
-checkGoogleIamV1TestIamPermissionsResponse(api.GoogleIamV1TestIamPermissionsResponse o) {
+checkGoogleIamV1TestIamPermissionsResponse(
+    api.GoogleIamV1TestIamPermissionsResponse o) {
   buildCounterGoogleIamV1TestIamPermissionsResponse++;
   if (buildCounterGoogleIamV1TestIamPermissionsResponse < 3) {
-    checkUnnamed29(o.permissions);
+    checkUnnamed22(o.permissions);
   }
   buildCounterGoogleIamV1TestIamPermissionsResponse--;
 }
 
-buildUnnamed30() {
+buildUnnamed23() {
   var o = new core.List<api.GoogleLongrunningOperation>();
   o.add(buildGoogleLongrunningOperation());
   o.add(buildGoogleLongrunningOperation());
   return o;
 }
 
-checkUnnamed30(core.List<api.GoogleLongrunningOperation> o) {
+checkUnnamed23(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleLongrunningOperation(o[0]);
   checkGoogleLongrunningOperation(o[1]);
@@ -1431,45 +1111,78 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed30();
+    o.operations = buildUnnamed23();
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
   return o;
 }
 
-checkGoogleLongrunningListOperationsResponse(api.GoogleLongrunningListOperationsResponse o) {
+checkGoogleLongrunningListOperationsResponse(
+    api.GoogleLongrunningListOperationsResponse o) {
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed30(o.operations);
+    checkUnnamed23(o.operations);
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
 }
 
-buildUnnamed31() {
+buildUnnamed24() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed31(core.Map<core.String, core.Object> o) {
+checkUnnamed24(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed32() {
+buildUnnamed25() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed32(core.Map<core.String, core.Object> o) {
+checkUnnamed25(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterGoogleLongrunningOperation = 0;
@@ -1479,9 +1192,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     o.done = true;
     o.error = buildGoogleRpcStatus();
-    o.metadata = buildUnnamed31();
+    o.metadata = buildUnnamed24();
     o.name = "foo";
-    o.response = buildUnnamed32();
+    o.response = buildUnnamed25();
   }
   buildCounterGoogleLongrunningOperation--;
   return o;
@@ -1492,9 +1205,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkGoogleRpcStatus(o.error);
-    checkUnnamed31(o.metadata);
+    checkUnnamed24(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed32(o.response);
+    checkUnnamed25(o.response);
   }
   buildCounterGoogleLongrunningOperation--;
 }
@@ -1503,43 +1216,57 @@
 buildGoogleProtobufEmpty() {
   var o = new api.GoogleProtobufEmpty();
   buildCounterGoogleProtobufEmpty++;
-  if (buildCounterGoogleProtobufEmpty < 3) {
-  }
+  if (buildCounterGoogleProtobufEmpty < 3) {}
   buildCounterGoogleProtobufEmpty--;
   return o;
 }
 
 checkGoogleProtobufEmpty(api.GoogleProtobufEmpty o) {
   buildCounterGoogleProtobufEmpty++;
-  if (buildCounterGoogleProtobufEmpty < 3) {
-  }
+  if (buildCounterGoogleProtobufEmpty < 3) {}
   buildCounterGoogleProtobufEmpty--;
 }
 
-buildUnnamed33() {
+buildUnnamed26() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed33(core.Map<core.String, core.Object> o) {
+checkUnnamed26(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed34() {
+buildUnnamed27() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed33());
-  o.add(buildUnnamed33());
+  o.add(buildUnnamed26());
+  o.add(buildUnnamed26());
   return o;
 }
 
-checkUnnamed34(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed27(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed33(o[0]);
-  checkUnnamed33(o[1]);
+  checkUnnamed26(o[0]);
+  checkUnnamed26(o[1]);
 }
 
 core.int buildCounterGoogleRpcStatus = 0;
@@ -1548,7 +1275,7 @@
   buildCounterGoogleRpcStatus++;
   if (buildCounterGoogleRpcStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed34();
+    o.details = buildUnnamed27();
     o.message = "foo";
   }
   buildCounterGoogleRpcStatus--;
@@ -1559,7 +1286,7 @@
   buildCounterGoogleRpcStatus++;
   if (buildCounterGoogleRpcStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed34(o.details);
+    checkUnnamed27(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterGoogleRpcStatus--;
@@ -1590,7 +1317,6 @@
   buildCounterGoogleTypeExpr--;
 }
 
-
 main() {
   unittest.group("obj-schema-GoogleApiHttpBody", () {
     unittest.test("to-json--from-json", () {
@@ -1600,16 +1326,17 @@
     });
   });
 
-
-  unittest.group("obj-schema-GoogleCloudMlV1HyperparameterOutputHyperparameterMetric", () {
+  unittest.group(
+      "obj-schema-GoogleCloudMlV1HyperparameterOutputHyperparameterMetric", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
-      var od = new api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric.fromJson(o.toJson());
+      var od = new api
+              .GoogleCloudMlV1HyperparameterOutputHyperparameterMetric.fromJson(
+          o.toJson());
       checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1AutoScaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1AutoScaling();
@@ -1618,7 +1345,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1CancelJobRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1CancelJobRequest();
@@ -1627,7 +1353,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1GetConfigResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1GetConfigResponse();
@@ -1636,7 +1361,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1HyperparameterOutput", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1HyperparameterOutput();
@@ -1645,7 +1369,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1HyperparameterSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1HyperparameterSpec();
@@ -1654,7 +1377,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1Job", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1Job();
@@ -1663,7 +1385,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1ListJobsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ListJobsResponse();
@@ -1672,7 +1393,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1ListModelsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ListModelsResponse();
@@ -1681,7 +1401,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1ListVersionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ListVersionsResponse();
@@ -1690,7 +1409,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1ManualScaling", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ManualScaling();
@@ -1699,7 +1417,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1Model", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1Model();
@@ -1708,7 +1425,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1OperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1OperationMetadata();
@@ -1717,7 +1433,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1ParameterSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1ParameterSpec();
@@ -1726,7 +1441,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1PredictRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1PredictRequest();
@@ -1735,7 +1449,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1PredictionInput", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1PredictionInput();
@@ -1744,7 +1457,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1PredictionOutput", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1PredictionOutput();
@@ -1753,16 +1465,15 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1SetDefaultVersionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1SetDefaultVersionRequest();
-      var od = new api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(o.toJson());
+      var od =
+          new api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(o.toJson());
       checkGoogleCloudMlV1SetDefaultVersionRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1TrainingInput", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1TrainingInput();
@@ -1771,7 +1482,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1TrainingOutput", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1TrainingOutput();
@@ -1780,7 +1490,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleCloudMlV1Version", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleCloudMlV1Version();
@@ -1789,70 +1498,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-GoogleCloudMlV1beta1AutoScaling", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleCloudMlV1beta1AutoScaling();
-      var od = new api.GoogleCloudMlV1beta1AutoScaling.fromJson(o.toJson());
-      checkGoogleCloudMlV1beta1AutoScaling(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleCloudMlV1beta1ManualScaling", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleCloudMlV1beta1ManualScaling();
-      var od = new api.GoogleCloudMlV1beta1ManualScaling.fromJson(o.toJson());
-      checkGoogleCloudMlV1beta1ManualScaling(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleCloudMlV1beta1OperationMetadata", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleCloudMlV1beta1OperationMetadata();
-      var od = new api.GoogleCloudMlV1beta1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudMlV1beta1OperationMetadata(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleCloudMlV1beta1Version", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleCloudMlV1beta1Version();
-      var od = new api.GoogleCloudMlV1beta1Version.fromJson(o.toJson());
-      checkGoogleCloudMlV1beta1Version(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleIamV1LogConfigCloudAuditOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleIamV1LogConfigCloudAuditOptions();
-      var od = new api.GoogleIamV1LogConfigCloudAuditOptions.fromJson(o.toJson());
-      checkGoogleIamV1LogConfigCloudAuditOptions(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleIamV1LogConfigCounterOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleIamV1LogConfigCounterOptions();
-      var od = new api.GoogleIamV1LogConfigCounterOptions.fromJson(o.toJson());
-      checkGoogleIamV1LogConfigCounterOptions(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleIamV1LogConfigDataAccessOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleIamV1LogConfigDataAccessOptions();
-      var od = new api.GoogleIamV1LogConfigDataAccessOptions.fromJson(o.toJson());
-      checkGoogleIamV1LogConfigDataAccessOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-GoogleIamV1AuditConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1AuditConfig();
@@ -1861,7 +1506,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleIamV1AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1AuditLogConfig();
@@ -1870,7 +1514,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleIamV1Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1Binding();
@@ -1879,25 +1522,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-GoogleIamV1Condition", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleIamV1Condition();
-      var od = new api.GoogleIamV1Condition.fromJson(o.toJson());
-      checkGoogleIamV1Condition(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-GoogleIamV1LogConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleIamV1LogConfig();
-      var od = new api.GoogleIamV1LogConfig.fromJson(o.toJson());
-      checkGoogleIamV1LogConfig(od);
-    });
-  });
-
-
   unittest.group("obj-schema-GoogleIamV1Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1Policy();
@@ -1906,16 +1530,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-GoogleIamV1Rule", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGoogleIamV1Rule();
-      var od = new api.GoogleIamV1Rule.fromJson(o.toJson());
-      checkGoogleIamV1Rule(od);
-    });
-  });
-
-
   unittest.group("obj-schema-GoogleIamV1SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1SetIamPolicyRequest();
@@ -1924,34 +1538,33 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleIamV1TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1TestIamPermissionsRequest();
-      var od = new api.GoogleIamV1TestIamPermissionsRequest.fromJson(o.toJson());
+      var od =
+          new api.GoogleIamV1TestIamPermissionsRequest.fromJson(o.toJson());
       checkGoogleIamV1TestIamPermissionsRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleIamV1TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleIamV1TestIamPermissionsResponse();
-      var od = new api.GoogleIamV1TestIamPermissionsResponse.fromJson(o.toJson());
+      var od =
+          new api.GoogleIamV1TestIamPermissionsResponse.fromJson(o.toJson());
       checkGoogleIamV1TestIamPermissionsResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleLongrunningListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = new api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var od =
+          new api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
       checkGoogleLongrunningListOperationsResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-GoogleLongrunningOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleLongrunningOperation();
@@ -1960,7 +1573,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleProtobufEmpty", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleProtobufEmpty();
@@ -1969,7 +1581,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleRpcStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleRpcStatus();
@@ -1978,7 +1589,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleTypeExpr", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleTypeExpr();
@@ -1987,10 +1597,8 @@
     });
   });
 
-
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--getConfig", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.MlApi(mock).projects;
       var arg_name = "foo";
@@ -1999,9 +1607,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2015,27 +1625,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1GetConfigResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getConfig(arg_name).then(unittest.expectAsync1(((api.GoogleCloudMlV1GetConfigResponse response) {
+      res.getConfig(arg_name).then(unittest
+          .expectAsync1(((api.GoogleCloudMlV1GetConfigResponse response) {
         checkGoogleCloudMlV1GetConfigResponse(response);
       })));
     });
 
     unittest.test("method--predict", () {
-
       var mock = new HttpServerMock();
       api.ProjectsResourceApi res = new api.MlApi(mock).projects;
       var arg_request = buildGoogleCloudMlV1PredictRequest();
@@ -2048,9 +1659,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2064,31 +1677,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleApiHttpBody());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.predict(arg_request, arg_name).then(unittest.expectAsync1(((api.GoogleApiHttpBody response) {
+      res
+          .predict(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.GoogleApiHttpBody response) {
         checkGoogleApiHttpBody(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsJobsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_request = buildGoogleCloudMlV1CancelJobRequest();
@@ -2101,9 +1714,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2117,27 +1732,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleProtobufEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_name).then(unittest.expectAsync1(((api.GoogleProtobufEmpty response) {
+      res
+          .cancel(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.GoogleProtobufEmpty response) {
         checkGoogleProtobufEmpty(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_request = buildGoogleCloudMlV1Job();
@@ -2150,9 +1767,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2166,27 +1785,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1Job());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.GoogleCloudMlV1Job response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Job response) {
         checkGoogleCloudMlV1Job(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_name = "foo";
@@ -2195,9 +1816,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2211,27 +1834,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1Job());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.GoogleCloudMlV1Job response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Job response) {
         checkGoogleCloudMlV1Job(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_resource = "foo";
@@ -2240,9 +1865,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2256,41 +1883,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleIamV1Policy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
         checkGoogleIamV1Policy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_parent = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2304,30 +1935,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1ListJobsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.GoogleCloudMlV1ListJobsResponse response) {
+      res
+          .list(arg_parent,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.GoogleCloudMlV1ListJobsResponse response) {
         checkGoogleCloudMlV1ListJobsResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_request = buildGoogleIamV1SetIamPolicyRequest();
@@ -2340,9 +1979,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2356,27 +1997,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleIamV1Policy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
         checkGoogleIamV1Policy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
       api.ProjectsJobsResourceApi res = new api.MlApi(mock).projects.jobs;
       var arg_request = buildGoogleIamV1TestIamPermissionsRequest();
@@ -2389,9 +2032,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2405,31 +2050,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildGoogleIamV1TestIamPermissionsResponse());
+        var resp =
+            convert.JSON.encode(buildGoogleIamV1TestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.GoogleIamV1TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(unittest
+          .expectAsync1(((api.GoogleIamV1TestIamPermissionsResponse response) {
         checkGoogleIamV1TestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsModelsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_request = buildGoogleCloudMlV1Model();
@@ -2442,9 +2087,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2458,27 +2105,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1Model());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.GoogleCloudMlV1Model response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Model response) {
         checkGoogleCloudMlV1Model(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_name = "foo";
@@ -2487,9 +2136,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2503,27 +2154,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleLongrunningOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_name).then(unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
+      res.delete(arg_name).then(
+          unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
         checkGoogleLongrunningOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_name = "foo";
@@ -2532,9 +2184,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2548,27 +2202,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1Model());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.GoogleCloudMlV1Model response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Model response) {
         checkGoogleCloudMlV1Model(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_resource = "foo";
@@ -2577,9 +2233,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2593,27 +2251,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleIamV1Policy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
         checkGoogleIamV1Policy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_parent = "foo";
@@ -2624,9 +2284,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2640,29 +2302,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildGoogleCloudMlV1ListModelsResponse());
+        var resp =
+            convert.JSON.encode(buildGoogleCloudMlV1ListModelsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.GoogleCloudMlV1ListModelsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.GoogleCloudMlV1ListModelsResponse response) {
         checkGoogleCloudMlV1ListModelsResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_request = buildGoogleIamV1SetIamPolicyRequest();
@@ -2675,9 +2343,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2691,27 +2361,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleIamV1Policy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.GoogleIamV1Policy response) {
         checkGoogleIamV1Policy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
       api.ProjectsModelsResourceApi res = new api.MlApi(mock).projects.models;
       var arg_request = buildGoogleIamV1TestIamPermissionsRequest();
@@ -2724,9 +2396,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2740,33 +2414,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildGoogleIamV1TestIamPermissionsResponse());
+        var resp =
+            convert.JSON.encode(buildGoogleIamV1TestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.GoogleIamV1TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(unittest
+          .expectAsync1(((api.GoogleIamV1TestIamPermissionsResponse response) {
         checkGoogleIamV1TestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsModelsVersionsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsModelsVersionsResourceApi res = new api.MlApi(mock).projects.models.versions;
+      api.ProjectsModelsVersionsResourceApi res =
+          new api.MlApi(mock).projects.models.versions;
       var arg_request = buildGoogleCloudMlV1Version();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2777,9 +2452,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2793,38 +2470,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleLongrunningOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
+      res.create(arg_request, arg_parent).then(
+          unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
         checkGoogleLongrunningOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsModelsVersionsResourceApi res = new api.MlApi(mock).projects.models.versions;
+      api.ProjectsModelsVersionsResourceApi res =
+          new api.MlApi(mock).projects.models.versions;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2838,38 +2519,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleLongrunningOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_name).then(unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
+      res.delete(arg_name).then(
+          unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
         checkGoogleLongrunningOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsModelsVersionsResourceApi res = new api.MlApi(mock).projects.models.versions;
+      api.ProjectsModelsVersionsResourceApi res =
+          new api.MlApi(mock).projects.models.versions;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2883,29 +2568,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1Version());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.GoogleCloudMlV1Version response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Version response) {
         checkGoogleCloudMlV1Version(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsModelsVersionsResourceApi res = new api.MlApi(mock).projects.models.versions;
+      api.ProjectsModelsVersionsResourceApi res =
+          new api.MlApi(mock).projects.models.versions;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2914,9 +2602,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2930,44 +2620,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildGoogleCloudMlV1ListVersionsResponse());
+        var resp =
+            convert.JSON.encode(buildGoogleCloudMlV1ListVersionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.GoogleCloudMlV1ListVersionsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(
+              ((api.GoogleCloudMlV1ListVersionsResponse response) {
         checkGoogleCloudMlV1ListVersionsResponse(response);
       })));
     });
 
     unittest.test("method--setDefault", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsModelsVersionsResourceApi res = new api.MlApi(mock).projects.models.versions;
+      api.ProjectsModelsVersionsResourceApi res =
+          new api.MlApi(mock).projects.models.versions;
       var arg_request = buildGoogleCloudMlV1SetDefaultVersionRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(json);
+        var obj =
+            new api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(json);
         checkGoogleCloudMlV1SetDefaultVersionRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2981,42 +2681,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleCloudMlV1Version());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setDefault(arg_request, arg_name).then(unittest.expectAsync1(((api.GoogleCloudMlV1Version response) {
+      res
+          .setDefault(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.GoogleCloudMlV1Version response) {
         checkGoogleCloudMlV1Version(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.MlApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.MlApi(mock).projects.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3030,38 +2733,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleProtobufEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_name).then(unittest.expectAsync1(((api.GoogleProtobufEmpty response) {
+      res
+          .cancel(arg_name)
+          .then(unittest.expectAsync1(((api.GoogleProtobufEmpty response) {
         checkGoogleProtobufEmpty(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.MlApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.MlApi(mock).projects.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3075,38 +2783,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleProtobufEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_name).then(unittest.expectAsync1(((api.GoogleProtobufEmpty response) {
+      res
+          .delete(arg_name)
+          .then(unittest.expectAsync1(((api.GoogleProtobufEmpty response) {
         checkGoogleProtobufEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.MlApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.MlApi(mock).projects.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3120,29 +2833,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleLongrunningOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
+      res.get(arg_name).then(
+          unittest.expectAsync1(((api.GoogleLongrunningOperation response) {
         checkGoogleLongrunningOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsOperationsResourceApi res = new api.MlApi(mock).projects.operations;
+      api.ProjectsOperationsResourceApi res =
+          new api.MlApi(mock).projects.operations;
       var arg_name = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -3152,9 +2867,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3168,30 +2885,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildGoogleLongrunningListOperationsResponse());
+        var resp =
+            convert.JSON.encode(buildGoogleLongrunningListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.GoogleLongrunningListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(
+              ((api.GoogleLongrunningListOperationsResponse response) {
         checkGoogleLongrunningListOperationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/oauth2/v2_test.dart b/generated/googleapis/test/oauth2/v2_test.dart
index b742b10..698853c 100644
--- a/generated/googleapis/test/oauth2/v2_test.dart
+++ b/generated/googleapis/test/oauth2/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.oauth2.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/oauth2/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -80,14 +79,14 @@
   buildCounterJwkKeys--;
 }
 
-buildUnnamed2516() {
+buildUnnamed2503() {
   var o = new core.List<api.JwkKeys>();
   o.add(buildJwkKeys());
   o.add(buildJwkKeys());
   return o;
 }
 
-checkUnnamed2516(core.List<api.JwkKeys> o) {
+checkUnnamed2503(core.List<api.JwkKeys> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJwkKeys(o[0]);
   checkJwkKeys(o[1]);
@@ -98,7 +97,7 @@
   var o = new api.Jwk();
   buildCounterJwk++;
   if (buildCounterJwk < 3) {
-    o.keys = buildUnnamed2516();
+    o.keys = buildUnnamed2503();
   }
   buildCounterJwk--;
   return o;
@@ -107,7 +106,7 @@
 checkJwk(api.Jwk o) {
   buildCounterJwk++;
   if (buildCounterJwk < 3) {
-    checkUnnamed2516(o.keys);
+    checkUnnamed2503(o.keys);
   }
   buildCounterJwk--;
 }
@@ -186,7 +185,6 @@
   buildCounterUserinfoplus--;
 }
 
-
 main() {
   unittest.group("obj-schema-JwkKeys", () {
     unittest.test("to-json--from-json", () {
@@ -196,7 +194,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Jwk", () {
     unittest.test("to-json--from-json", () {
       var o = buildJwk();
@@ -205,7 +202,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Tokeninfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokeninfo();
@@ -214,7 +210,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Userinfoplus", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserinfoplus();
@@ -223,10 +218,8 @@
     });
   });
 
-
   unittest.group("resource-Oauth2Api", () {
     unittest.test("method--getCertForOpenIdConnect", () {
-
       var mock = new HttpServerMock();
       api.Oauth2Api res = new api.Oauth2Api(mock);
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -234,9 +227,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("oauth2/v2/certs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("oauth2/v2/certs"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -249,27 +244,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJwk());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getCertForOpenIdConnect().then(unittest.expectAsync1(((api.Jwk response) {
+      res
+          .getCertForOpenIdConnect()
+          .then(unittest.expectAsync1(((api.Jwk response) {
         checkJwk(response);
       })));
     });
 
     unittest.test("method--tokeninfo", () {
-
       var mock = new HttpServerMock();
       api.Oauth2Api res = new api.Oauth2Api(mock);
       var arg_accessToken = "foo";
@@ -280,9 +277,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("oauth2/v2/tokeninfo"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("oauth2/v2/tokeninfo"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -295,34 +294,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["access_token"].first, unittest.equals(arg_accessToken));
-        unittest.expect(queryMap["id_token"].first, unittest.equals(arg_idToken));
-        unittest.expect(queryMap["token_handle"].first, unittest.equals(arg_tokenHandle));
-
+        unittest.expect(
+            queryMap["access_token"].first, unittest.equals(arg_accessToken));
+        unittest.expect(
+            queryMap["id_token"].first, unittest.equals(arg_idToken));
+        unittest.expect(
+            queryMap["token_handle"].first, unittest.equals(arg_tokenHandle));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTokeninfo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.tokeninfo(accessToken: arg_accessToken, idToken: arg_idToken, tokenHandle: arg_tokenHandle).then(unittest.expectAsync1(((api.Tokeninfo response) {
+      res
+          .tokeninfo(
+              accessToken: arg_accessToken,
+              idToken: arg_idToken,
+              tokenHandle: arg_tokenHandle)
+          .then(unittest.expectAsync1(((api.Tokeninfo response) {
         checkTokeninfo(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UserinfoResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UserinfoResourceApi res = new api.Oauth2Api(mock).userinfo;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -330,9 +335,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("oauth2/v2/userinfo"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("oauth2/v2/userinfo"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -345,16 +352,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUserinfoplus());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -363,13 +371,10 @@
         checkUserinfoplus(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UserinfoV2MeResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UserinfoV2MeResourceApi res = new api.Oauth2Api(mock).userinfo.v2.me;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -377,9 +382,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("userinfo/v2/me"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("userinfo/v2/me"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -392,16 +399,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUserinfoplus());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -410,9 +418,5 @@
         checkUserinfoplus(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/playcustomapp/v1_test.dart b/generated/googleapis/test/playcustomapp/v1_test.dart
index fdbd3b3..24fefce 100644
--- a/generated/googleapis/test/playcustomapp/v1_test.dart
+++ b/generated/googleapis/test/playcustomapp/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.playcustomapp.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/playcustomapp/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -72,7 +71,6 @@
   buildCounterCustomApp--;
 }
 
-
 main() {
   unittest.group("obj-schema-CustomApp", () {
     unittest.test("to-json--from-json", () {
@@ -82,14 +80,14 @@
     });
   });
 
-
   unittest.group("resource-AccountsCustomAppsResourceApi", () {
     unittest.test("method--create", () {
       // TODO: Implement tests for media upload;
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.AccountsCustomAppsResourceApi res = new api.PlaycustomappApi(mock).accounts.customApps;
+      api.AccountsCustomAppsResourceApi res =
+          new api.PlaycustomappApi(mock).accounts.customApps;
       var arg_request = buildCustomApp();
       var arg_account = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -100,7 +98,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -113,27 +112,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomApp());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_account).then(unittest.expectAsync1(((api.CustomApp response) {
+      res
+          .create(arg_request, arg_account)
+          .then(unittest.expectAsync1(((api.CustomApp response) {
         checkCustomApp(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/plus/v1_test.dart b/generated/googleapis/test/plus/v1_test.dart
index 464a2ee..a0977f5 100644
--- a/generated/googleapis/test/plus/v1_test.dart
+++ b/generated/googleapis/test/plus/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.plus.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/plus/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed155() {
+buildUnnamed150() {
   var o = new core.List<api.PlusAclentryResource>();
   o.add(buildPlusAclentryResource());
   o.add(buildPlusAclentryResource());
   return o;
 }
 
-checkUnnamed155(core.List<api.PlusAclentryResource> o) {
+checkUnnamed150(core.List<api.PlusAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusAclentryResource(o[0]);
   checkPlusAclentryResource(o[1]);
@@ -70,7 +69,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed155();
+    o.items = buildUnnamed150();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -81,7 +80,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed155(o.items);
+    checkUnnamed150(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -98,7 +97,8 @@
   return o;
 }
 
-checkActivityActorClientSpecificActorInfoYoutubeActorInfo(api.ActivityActorClientSpecificActorInfoYoutubeActorInfo o) {
+checkActivityActorClientSpecificActorInfoYoutubeActorInfo(
+    api.ActivityActorClientSpecificActorInfoYoutubeActorInfo o) {
   buildCounterActivityActorClientSpecificActorInfoYoutubeActorInfo++;
   if (buildCounterActivityActorClientSpecificActorInfoYoutubeActorInfo < 3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
@@ -111,16 +111,19 @@
   var o = new api.ActivityActorClientSpecificActorInfo();
   buildCounterActivityActorClientSpecificActorInfo++;
   if (buildCounterActivityActorClientSpecificActorInfo < 3) {
-    o.youtubeActorInfo = buildActivityActorClientSpecificActorInfoYoutubeActorInfo();
+    o.youtubeActorInfo =
+        buildActivityActorClientSpecificActorInfoYoutubeActorInfo();
   }
   buildCounterActivityActorClientSpecificActorInfo--;
   return o;
 }
 
-checkActivityActorClientSpecificActorInfo(api.ActivityActorClientSpecificActorInfo o) {
+checkActivityActorClientSpecificActorInfo(
+    api.ActivityActorClientSpecificActorInfo o) {
   buildCounterActivityActorClientSpecificActorInfo++;
   if (buildCounterActivityActorClientSpecificActorInfo < 3) {
-    checkActivityActorClientSpecificActorInfoYoutubeActorInfo(o.youtubeActorInfo);
+    checkActivityActorClientSpecificActorInfoYoutubeActorInfo(
+        o.youtubeActorInfo);
   }
   buildCounterActivityActorClientSpecificActorInfo--;
 }
@@ -215,20 +218,24 @@
   buildCounterActivityActor--;
 }
 
-core.int buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo = 0;
+core.int
+    buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo = 0;
 buildActivityObjectActorClientSpecificActorInfoYoutubeActorInfo() {
   var o = new api.ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo();
   buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo++;
-  if (buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo < 3) {
+  if (buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo <
+      3) {
     o.channelId = "foo";
   }
   buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo--;
   return o;
 }
 
-checkActivityObjectActorClientSpecificActorInfoYoutubeActorInfo(api.ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo o) {
+checkActivityObjectActorClientSpecificActorInfoYoutubeActorInfo(
+    api.ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo o) {
   buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo++;
-  if (buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo < 3) {
+  if (buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo <
+      3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
   }
   buildCounterActivityObjectActorClientSpecificActorInfoYoutubeActorInfo--;
@@ -239,16 +246,19 @@
   var o = new api.ActivityObjectActorClientSpecificActorInfo();
   buildCounterActivityObjectActorClientSpecificActorInfo++;
   if (buildCounterActivityObjectActorClientSpecificActorInfo < 3) {
-    o.youtubeActorInfo = buildActivityObjectActorClientSpecificActorInfoYoutubeActorInfo();
+    o.youtubeActorInfo =
+        buildActivityObjectActorClientSpecificActorInfoYoutubeActorInfo();
   }
   buildCounterActivityObjectActorClientSpecificActorInfo--;
   return o;
 }
 
-checkActivityObjectActorClientSpecificActorInfo(api.ActivityObjectActorClientSpecificActorInfo o) {
+checkActivityObjectActorClientSpecificActorInfo(
+    api.ActivityObjectActorClientSpecificActorInfo o) {
   buildCounterActivityObjectActorClientSpecificActorInfo++;
   if (buildCounterActivityObjectActorClientSpecificActorInfo < 3) {
-    checkActivityObjectActorClientSpecificActorInfoYoutubeActorInfo(o.youtubeActorInfo);
+    checkActivityObjectActorClientSpecificActorInfoYoutubeActorInfo(
+        o.youtubeActorInfo);
   }
   buildCounterActivityObjectActorClientSpecificActorInfo--;
 }
@@ -296,7 +306,8 @@
   var o = new api.ActivityObjectActor();
   buildCounterActivityObjectActor++;
   if (buildCounterActivityObjectActor < 3) {
-    o.clientSpecificActorInfo = buildActivityObjectActorClientSpecificActorInfo();
+    o.clientSpecificActorInfo =
+        buildActivityObjectActorClientSpecificActorInfo();
     o.displayName = "foo";
     o.id = "foo";
     o.image = buildActivityObjectActorImage();
@@ -355,7 +366,8 @@
   return o;
 }
 
-checkActivityObjectAttachmentsFullImage(api.ActivityObjectAttachmentsFullImage o) {
+checkActivityObjectAttachmentsFullImage(
+    api.ActivityObjectAttachmentsFullImage o) {
   buildCounterActivityObjectAttachmentsFullImage++;
   if (buildCounterActivityObjectAttachmentsFullImage < 3) {
     unittest.expect(o.height, unittest.equals(42));
@@ -405,7 +417,8 @@
   return o;
 }
 
-checkActivityObjectAttachmentsThumbnailsImage(api.ActivityObjectAttachmentsThumbnailsImage o) {
+checkActivityObjectAttachmentsThumbnailsImage(
+    api.ActivityObjectAttachmentsThumbnailsImage o) {
   buildCounterActivityObjectAttachmentsThumbnailsImage++;
   if (buildCounterActivityObjectAttachmentsThumbnailsImage < 3) {
     unittest.expect(o.height, unittest.equals(42));
@@ -429,7 +442,8 @@
   return o;
 }
 
-checkActivityObjectAttachmentsThumbnails(api.ActivityObjectAttachmentsThumbnails o) {
+checkActivityObjectAttachmentsThumbnails(
+    api.ActivityObjectAttachmentsThumbnails o) {
   buildCounterActivityObjectAttachmentsThumbnails++;
   if (buildCounterActivityObjectAttachmentsThumbnails < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
@@ -439,14 +453,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed156() {
+buildUnnamed151() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed156(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed151(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -464,7 +478,7 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.thumbnails = buildUnnamed156();
+    o.thumbnails = buildUnnamed151();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -481,20 +495,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed156(o.thumbnails);
+    checkUnnamed151(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed157() {
+buildUnnamed152() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed157(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed152(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -569,7 +583,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed157();
+    o.attachments = buildUnnamed152();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -587,7 +601,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed157(o.attachments);
+    checkUnnamed152(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -666,24 +680,26 @@
     unittest.expect(o.placeId, unittest.equals('foo'));
     unittest.expect(o.placeName, unittest.equals('foo'));
     checkActivityProvider(o.provider);
-    unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.published,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.radius, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.url, unittest.equals('foo'));
     unittest.expect(o.verb, unittest.equals('foo'));
   }
   buildCounterActivity--;
 }
 
-buildUnnamed158() {
+buildUnnamed153() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed158(core.List<api.Activity> o) {
+checkUnnamed153(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -696,7 +712,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed158();
+    o.items = buildUnnamed153();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -713,13 +729,14 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed158(o.items);
+    checkUnnamed153(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterActivityFeed--;
 }
@@ -735,7 +752,8 @@
   return o;
 }
 
-checkCommentActorClientSpecificActorInfoYoutubeActorInfo(api.CommentActorClientSpecificActorInfoYoutubeActorInfo o) {
+checkCommentActorClientSpecificActorInfoYoutubeActorInfo(
+    api.CommentActorClientSpecificActorInfoYoutubeActorInfo o) {
   buildCounterCommentActorClientSpecificActorInfoYoutubeActorInfo++;
   if (buildCounterCommentActorClientSpecificActorInfoYoutubeActorInfo < 3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
@@ -748,16 +766,19 @@
   var o = new api.CommentActorClientSpecificActorInfo();
   buildCounterCommentActorClientSpecificActorInfo++;
   if (buildCounterCommentActorClientSpecificActorInfo < 3) {
-    o.youtubeActorInfo = buildCommentActorClientSpecificActorInfoYoutubeActorInfo();
+    o.youtubeActorInfo =
+        buildCommentActorClientSpecificActorInfoYoutubeActorInfo();
   }
   buildCounterCommentActorClientSpecificActorInfo--;
   return o;
 }
 
-checkCommentActorClientSpecificActorInfo(api.CommentActorClientSpecificActorInfo o) {
+checkCommentActorClientSpecificActorInfo(
+    api.CommentActorClientSpecificActorInfo o) {
   buildCounterCommentActorClientSpecificActorInfo++;
   if (buildCounterCommentActorClientSpecificActorInfo < 3) {
-    checkCommentActorClientSpecificActorInfoYoutubeActorInfo(o.youtubeActorInfo);
+    checkCommentActorClientSpecificActorInfoYoutubeActorInfo(
+        o.youtubeActorInfo);
   }
   buildCounterCommentActorClientSpecificActorInfo--;
 }
@@ -850,14 +871,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed159() {
+buildUnnamed154() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed159(core.List<api.CommentInReplyTo> o) {
+checkUnnamed154(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -913,7 +934,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed159();
+    o.inReplyTo = buildUnnamed154();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -932,26 +953,28 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed159(o.inReplyTo);
+    checkUnnamed154(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
-    unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.published,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.verb, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed160() {
+buildUnnamed155() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed160(core.List<api.Comment> o) {
+checkUnnamed155(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -964,7 +987,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed160();
+    o.items = buildUnnamed155();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -980,24 +1003,25 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed160(o.items);
+    checkUnnamed155(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterCommentFeed--;
 }
 
-buildUnnamed161() {
+buildUnnamed156() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed161(core.List<api.Person> o) {
+checkUnnamed156(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1009,7 +1033,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed161();
+    o.items = buildUnnamed156();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1024,7 +1048,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed161(o.items);
+    checkUnnamed156(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1143,14 +1167,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed162() {
+buildUnnamed157() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed162(core.List<api.PersonEmails> o) {
+checkUnnamed157(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1241,14 +1265,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed163() {
+buildUnnamed158() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed163(core.List<api.PersonOrganizations> o) {
+checkUnnamed158(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1275,14 +1299,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed164() {
+buildUnnamed159() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed164(core.List<api.PersonPlacesLived> o) {
+checkUnnamed159(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1311,14 +1335,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed165() {
+buildUnnamed160() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed165(core.List<api.PersonUrls> o) {
+checkUnnamed160(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1338,7 +1362,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed162();
+    o.emails = buildUnnamed157();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1350,14 +1374,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed163();
-    o.placesLived = buildUnnamed164();
+    o.organizations = buildUnnamed158();
+    o.placesLived = buildUnnamed159();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed165();
+    o.urls = buildUnnamed160();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1376,7 +1400,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed162(o.emails);
+    checkUnnamed157(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1388,14 +1412,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed163(o.organizations);
-    checkUnnamed164(o.placesLived);
+    checkUnnamed158(o.organizations);
+    checkUnnamed159(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed165(o.urls);
+    checkUnnamed160(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1491,7 +1515,6 @@
   buildCounterPlusAclentryResource--;
 }
 
-
 main() {
   unittest.group("obj-schema-Acl", () {
     unittest.test("to-json--from-json", () {
@@ -1501,25 +1524,26 @@
     });
   });
 
-
-  unittest.group("obj-schema-ActivityActorClientSpecificActorInfoYoutubeActorInfo", () {
+  unittest.group(
+      "obj-schema-ActivityActorClientSpecificActorInfoYoutubeActorInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActorClientSpecificActorInfoYoutubeActorInfo();
-      var od = new api.ActivityActorClientSpecificActorInfoYoutubeActorInfo.fromJson(o.toJson());
+      var od =
+          new api.ActivityActorClientSpecificActorInfoYoutubeActorInfo.fromJson(
+              o.toJson());
       checkActivityActorClientSpecificActorInfoYoutubeActorInfo(od);
     });
   });
 
-
   unittest.group("obj-schema-ActivityActorClientSpecificActorInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActorClientSpecificActorInfo();
-      var od = new api.ActivityActorClientSpecificActorInfo.fromJson(o.toJson());
+      var od =
+          new api.ActivityActorClientSpecificActorInfo.fromJson(o.toJson());
       checkActivityActorClientSpecificActorInfo(od);
     });
   });
 
-
   unittest.group("obj-schema-ActivityActorImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActorImage();
@@ -1528,7 +1552,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityActorName", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActorName();
@@ -1537,7 +1560,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityActorVerification", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActorVerification();
@@ -1546,7 +1568,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityActor", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityActor();
@@ -1555,25 +1576,27 @@
     });
   });
 
-
-  unittest.group("obj-schema-ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo", () {
+  unittest.group(
+      "obj-schema-ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectActorClientSpecificActorInfoYoutubeActorInfo();
-      var od = new api.ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo.fromJson(o.toJson());
+      var od = new api
+              .ActivityObjectActorClientSpecificActorInfoYoutubeActorInfo.fromJson(
+          o.toJson());
       checkActivityObjectActorClientSpecificActorInfoYoutubeActorInfo(od);
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectActorClientSpecificActorInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectActorClientSpecificActorInfo();
-      var od = new api.ActivityObjectActorClientSpecificActorInfo.fromJson(o.toJson());
+      var od = new api.ActivityObjectActorClientSpecificActorInfo.fromJson(
+          o.toJson());
       checkActivityObjectActorClientSpecificActorInfo(od);
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectActorImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectActorImage();
@@ -1582,7 +1605,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectActorVerification", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectActorVerification();
@@ -1591,7 +1613,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectActor", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectActor();
@@ -1600,7 +1621,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectAttachmentsEmbed", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectAttachmentsEmbed();
@@ -1609,7 +1629,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectAttachmentsFullImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectAttachmentsFullImage();
@@ -1618,7 +1637,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectAttachmentsImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectAttachmentsImage();
@@ -1627,16 +1645,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectAttachmentsThumbnailsImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectAttachmentsThumbnailsImage();
-      var od = new api.ActivityObjectAttachmentsThumbnailsImage.fromJson(o.toJson());
+      var od =
+          new api.ActivityObjectAttachmentsThumbnailsImage.fromJson(o.toJson());
       checkActivityObjectAttachmentsThumbnailsImage(od);
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectAttachmentsThumbnails", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectAttachmentsThumbnails();
@@ -1645,7 +1662,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectAttachments", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectAttachments();
@@ -1654,7 +1670,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectPlusoners", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectPlusoners();
@@ -1663,7 +1678,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectReplies", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectReplies();
@@ -1672,7 +1686,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObjectResharers", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObjectResharers();
@@ -1681,7 +1694,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityObject", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityObject();
@@ -1690,7 +1702,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityProvider", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityProvider();
@@ -1699,7 +1710,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Activity", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivity();
@@ -1708,7 +1718,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityFeed", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityFeed();
@@ -1717,16 +1726,17 @@
     });
   });
 
-
-  unittest.group("obj-schema-CommentActorClientSpecificActorInfoYoutubeActorInfo", () {
+  unittest.group(
+      "obj-schema-CommentActorClientSpecificActorInfoYoutubeActorInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentActorClientSpecificActorInfoYoutubeActorInfo();
-      var od = new api.CommentActorClientSpecificActorInfoYoutubeActorInfo.fromJson(o.toJson());
+      var od =
+          new api.CommentActorClientSpecificActorInfoYoutubeActorInfo.fromJson(
+              o.toJson());
       checkCommentActorClientSpecificActorInfoYoutubeActorInfo(od);
     });
   });
 
-
   unittest.group("obj-schema-CommentActorClientSpecificActorInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentActorClientSpecificActorInfo();
@@ -1735,7 +1745,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentActorImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentActorImage();
@@ -1744,7 +1753,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentActorVerification", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentActorVerification();
@@ -1753,7 +1761,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentActor", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentActor();
@@ -1762,7 +1769,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentInReplyTo", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentInReplyTo();
@@ -1771,7 +1777,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentObject", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentObject();
@@ -1780,7 +1785,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentPlusoners", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentPlusoners();
@@ -1789,7 +1793,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Comment", () {
     unittest.test("to-json--from-json", () {
       var o = buildComment();
@@ -1798,7 +1801,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentFeed", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentFeed();
@@ -1807,7 +1809,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PeopleFeed", () {
     unittest.test("to-json--from-json", () {
       var o = buildPeopleFeed();
@@ -1816,7 +1817,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonAgeRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonAgeRange();
@@ -1825,7 +1825,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonCoverCoverInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonCoverCoverInfo();
@@ -1834,7 +1833,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonCoverCoverPhoto", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonCoverCoverPhoto();
@@ -1843,7 +1841,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonCover", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonCover();
@@ -1852,7 +1849,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonEmails", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonEmails();
@@ -1861,7 +1857,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonImage();
@@ -1870,7 +1865,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonName", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonName();
@@ -1879,7 +1873,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonOrganizations", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonOrganizations();
@@ -1888,7 +1881,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonPlacesLived", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonPlacesLived();
@@ -1897,7 +1889,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PersonUrls", () {
     unittest.test("to-json--from-json", () {
       var o = buildPersonUrls();
@@ -1906,7 +1897,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Person", () {
     unittest.test("to-json--from-json", () {
       var o = buildPerson();
@@ -1915,7 +1905,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaceAddress", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaceAddress();
@@ -1924,7 +1913,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlacePosition", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlacePosition();
@@ -1933,7 +1921,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Place", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlace();
@@ -1942,7 +1929,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlusAclentryResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlusAclentryResource();
@@ -1951,10 +1937,8 @@
     });
   });
 
-
   unittest.group("resource-ActivitiesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.PlusApi(mock).activities;
       var arg_activityId = "foo";
@@ -1963,11 +1947,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("activities/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1983,27 +1970,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildActivity());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_activityId).then(unittest.expectAsync1(((api.Activity response) {
+      res
+          .get(arg_activityId)
+          .then(unittest.expectAsync1(((api.Activity response) {
         checkActivity(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.PlusApi(mock).activities;
       var arg_userId = "foo";
@@ -2015,18 +2004,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/activities/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/activities/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/activities/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2042,29 +2036,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildActivityFeed());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_userId, arg_collection, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ActivityFeed response) {
+      res
+          .list(arg_userId, arg_collection,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ActivityFeed response) {
         checkActivityFeed(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.PlusApi(mock).activities;
       var arg_query = "foo";
@@ -2077,11 +2076,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("activities"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -2094,36 +2096,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildActivityFeed());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_query, language: arg_language, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ActivityFeed response) {
+      res
+          .search(arg_query,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ActivityFeed response) {
         checkActivityFeed(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CommentsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.PlusApi(mock).comments;
       var arg_commentId = "foo";
@@ -2132,11 +2142,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("comments/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("comments/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2152,27 +2165,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_commentId).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .get(arg_commentId)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.PlusApi(mock).comments;
       var arg_activityId = "foo";
@@ -2184,18 +2199,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/comments", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_activityId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/comments"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -2208,34 +2228,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentFeed());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_activityId, maxResults: arg_maxResults, pageToken: arg_pageToken, sortOrder: arg_sortOrder).then(unittest.expectAsync1(((api.CommentFeed response) {
+      res
+          .list(arg_activityId,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              sortOrder: arg_sortOrder)
+          .then(unittest.expectAsync1(((api.CommentFeed response) {
         checkCommentFeed(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PeopleResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.PeopleResourceApi res = new api.PlusApi(mock).people;
       var arg_userId = "foo";
@@ -2244,11 +2270,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("people/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2264,16 +2293,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPerson());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2284,7 +2314,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PeopleResourceApi res = new api.PlusApi(mock).people;
       var arg_userId = "foo";
@@ -2297,18 +2326,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/people/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/people/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/people/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2324,30 +2358,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["orderBy"].first, unittest.equals(arg_orderBy));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPeopleFeed());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_userId, arg_collection, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PeopleFeed response) {
+      res
+          .list(arg_userId, arg_collection,
+              maxResults: arg_maxResults,
+              orderBy: arg_orderBy,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.PeopleFeed response) {
         checkPeopleFeed(response);
       })));
     });
 
     unittest.test("method--listByActivity", () {
-
       var mock = new HttpServerMock();
       api.PeopleResourceApi res = new api.PlusApi(mock).people;
       var arg_activityId = "foo";
@@ -2359,18 +2401,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/people/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_activityId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/people/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/people/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -2386,29 +2433,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPeopleFeed());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.listByActivity(arg_activityId, arg_collection, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PeopleFeed response) {
+      res
+          .listByActivity(arg_activityId, arg_collection,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.PeopleFeed response) {
         checkPeopleFeed(response);
       })));
     });
 
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.PeopleResourceApi res = new api.PlusApi(mock).people;
       var arg_query = "foo";
@@ -2420,11 +2472,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("plus/v1/"));
         pathOffset += 8;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("people"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("people"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -2437,31 +2492,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
-        unittest.expect(queryMap["language"].first, unittest.equals(arg_language));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["language"].first, unittest.equals(arg_language));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPeopleFeed());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_query, language: arg_language, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PeopleFeed response) {
+      res
+          .search(arg_query,
+              language: arg_language,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.PeopleFeed response) {
         checkPeopleFeed(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/prediction/v1_6_test.dart b/generated/googleapis/test/prediction/v1_6_test.dart
index 19e869d..c59eb93 100644
--- a/generated/googleapis/test/prediction/v1_6_test.dart
+++ b/generated/googleapis/test/prediction/v1_6_test.dart
@@ -1,12 +1,10 @@
 library googleapis.prediction.v1_6.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/prediction/v1_6.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -63,7 +62,8 @@
   return o;
 }
 
-checkAnalyzeDataDescriptionFeaturesCategoricalValues(api.AnalyzeDataDescriptionFeaturesCategoricalValues o) {
+checkAnalyzeDataDescriptionFeaturesCategoricalValues(
+    api.AnalyzeDataDescriptionFeaturesCategoricalValues o) {
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
@@ -72,14 +72,15 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues--;
 }
 
-buildUnnamed1886() {
+buildUnnamed1884() {
   var o = new core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues>();
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   return o;
 }
 
-checkUnnamed1886(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
+checkUnnamed1884(
+    core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[0]);
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[1]);
@@ -91,17 +92,18 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     o.count = "foo";
-    o.values = buildUnnamed1886();
+    o.values = buildUnnamed1884();
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
   return o;
 }
 
-checkAnalyzeDataDescriptionFeaturesCategorical(api.AnalyzeDataDescriptionFeaturesCategorical o) {
+checkAnalyzeDataDescriptionFeaturesCategorical(
+    api.AnalyzeDataDescriptionFeaturesCategorical o) {
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed1886(o.values);
+    checkUnnamed1884(o.values);
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
 }
@@ -119,7 +121,8 @@
   return o;
 }
 
-checkAnalyzeDataDescriptionFeaturesNumeric(api.AnalyzeDataDescriptionFeaturesNumeric o) {
+checkAnalyzeDataDescriptionFeaturesNumeric(
+    api.AnalyzeDataDescriptionFeaturesNumeric o) {
   buildCounterAnalyzeDataDescriptionFeaturesNumeric++;
   if (buildCounterAnalyzeDataDescriptionFeaturesNumeric < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
@@ -140,7 +143,8 @@
   return o;
 }
 
-checkAnalyzeDataDescriptionFeaturesText(api.AnalyzeDataDescriptionFeaturesText o) {
+checkAnalyzeDataDescriptionFeaturesText(
+    api.AnalyzeDataDescriptionFeaturesText o) {
   buildCounterAnalyzeDataDescriptionFeaturesText++;
   if (buildCounterAnalyzeDataDescriptionFeaturesText < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
@@ -173,14 +177,14 @@
   buildCounterAnalyzeDataDescriptionFeatures--;
 }
 
-buildUnnamed1887() {
+buildUnnamed1885() {
   var o = new core.List<api.AnalyzeDataDescriptionFeatures>();
   o.add(buildAnalyzeDataDescriptionFeatures());
   o.add(buildAnalyzeDataDescriptionFeatures());
   return o;
 }
 
-checkUnnamed1887(core.List<api.AnalyzeDataDescriptionFeatures> o) {
+checkUnnamed1885(core.List<api.AnalyzeDataDescriptionFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeatures(o[0]);
   checkAnalyzeDataDescriptionFeatures(o[1]);
@@ -199,7 +203,8 @@
   return o;
 }
 
-checkAnalyzeDataDescriptionOutputFeatureNumeric(api.AnalyzeDataDescriptionOutputFeatureNumeric o) {
+checkAnalyzeDataDescriptionOutputFeatureNumeric(
+    api.AnalyzeDataDescriptionOutputFeatureNumeric o) {
   buildCounterAnalyzeDataDescriptionOutputFeatureNumeric++;
   if (buildCounterAnalyzeDataDescriptionOutputFeatureNumeric < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
@@ -221,7 +226,8 @@
   return o;
 }
 
-checkAnalyzeDataDescriptionOutputFeatureText(api.AnalyzeDataDescriptionOutputFeatureText o) {
+checkAnalyzeDataDescriptionOutputFeatureText(
+    api.AnalyzeDataDescriptionOutputFeatureText o) {
   buildCounterAnalyzeDataDescriptionOutputFeatureText++;
   if (buildCounterAnalyzeDataDescriptionOutputFeatureText < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
@@ -230,14 +236,14 @@
   buildCounterAnalyzeDataDescriptionOutputFeatureText--;
 }
 
-buildUnnamed1888() {
+buildUnnamed1886() {
   var o = new core.List<api.AnalyzeDataDescriptionOutputFeatureText>();
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   return o;
 }
 
-checkUnnamed1888(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
+checkUnnamed1886(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionOutputFeatureText(o[0]);
   checkAnalyzeDataDescriptionOutputFeatureText(o[1]);
@@ -249,17 +255,18 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     o.numeric = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-    o.text = buildUnnamed1888();
+    o.text = buildUnnamed1886();
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
   return o;
 }
 
-checkAnalyzeDataDescriptionOutputFeature(api.AnalyzeDataDescriptionOutputFeature o) {
+checkAnalyzeDataDescriptionOutputFeature(
+    api.AnalyzeDataDescriptionOutputFeature o) {
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     checkAnalyzeDataDescriptionOutputFeatureNumeric(o.numeric);
-    checkUnnamed1888(o.text);
+    checkUnnamed1886(o.text);
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
 }
@@ -269,7 +276,7 @@
   var o = new api.AnalyzeDataDescription();
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    o.features = buildUnnamed1887();
+    o.features = buildUnnamed1885();
     o.outputFeature = buildAnalyzeDataDescriptionOutputFeature();
   }
   buildCounterAnalyzeDataDescription--;
@@ -279,12 +286,38 @@
 checkAnalyzeDataDescription(api.AnalyzeDataDescription o) {
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    checkUnnamed1887(o.features);
+    checkUnnamed1885(o.features);
     checkAnalyzeDataDescriptionOutputFeature(o.outputFeature);
   }
   buildCounterAnalyzeDataDescription--;
 }
 
+buildUnnamed1887() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed1887(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
+buildUnnamed1888() {
+  var o = new core.List<core.Map<core.String, core.String>>();
+  o.add(buildUnnamed1887());
+  o.add(buildUnnamed1887());
+  return o;
+}
+
+checkUnnamed1888(core.List<core.Map<core.String, core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1887(o[0]);
+  checkUnnamed1887(o[1]);
+}
+
 buildUnnamed1889() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
@@ -299,16 +332,16 @@
 }
 
 buildUnnamed1890() {
-  var o = new core.List<core.Map<core.String, core.String>>();
-  o.add(buildUnnamed1889());
-  o.add(buildUnnamed1889());
+  var o = new core.Map<core.String, core.Map<core.String, core.String>>();
+  o["x"] = buildUnnamed1889();
+  o["y"] = buildUnnamed1889();
   return o;
 }
 
-checkUnnamed1890(core.List<core.Map<core.String, core.String>> o) {
+checkUnnamed1890(core.Map<core.String, core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1889(o[0]);
-  checkUnnamed1889(o[1]);
+  checkUnnamed1889(o["x"]);
+  checkUnnamed1889(o["y"]);
 }
 
 buildUnnamed1891() {
@@ -324,39 +357,13 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1892() {
-  var o = new core.Map<core.String, core.Map<core.String, core.String>>();
-  o["x"] = buildUnnamed1891();
-  o["y"] = buildUnnamed1891();
-  return o;
-}
-
-checkUnnamed1892(core.Map<core.String, core.Map<core.String, core.String>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1891(o["x"]);
-  checkUnnamed1891(o["y"]);
-}
-
-buildUnnamed1893() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed1893(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
 core.int buildCounterAnalyzeModelDescription = 0;
 buildAnalyzeModelDescription() {
   var o = new api.AnalyzeModelDescription();
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    o.confusionMatrix = buildUnnamed1892();
-    o.confusionMatrixRowTotals = buildUnnamed1893();
+    o.confusionMatrix = buildUnnamed1890();
+    o.confusionMatrixRowTotals = buildUnnamed1891();
     o.modelinfo = buildInsert2();
   }
   buildCounterAnalyzeModelDescription--;
@@ -366,8 +373,8 @@
 checkAnalyzeModelDescription(api.AnalyzeModelDescription o) {
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    checkUnnamed1892(o.confusionMatrix);
-    checkUnnamed1893(o.confusionMatrixRowTotals);
+    checkUnnamed1890(o.confusionMatrix);
+    checkUnnamed1891(o.confusionMatrixRowTotals);
     checkInsert2(o.modelinfo);
   }
   buildCounterAnalyzeModelDescription--;
@@ -379,7 +386,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     o.dataDescription = buildAnalyzeDataDescription();
-    o.errors = buildUnnamed1890();
+    o.errors = buildUnnamed1888();
     o.id = "foo";
     o.kind = "foo";
     o.modelDescription = buildAnalyzeModelDescription();
@@ -393,7 +400,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     checkAnalyzeDataDescription(o.dataDescription);
-    checkUnnamed1890(o.errors);
+    checkUnnamed1888(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkAnalyzeModelDescription(o.modelDescription);
@@ -402,17 +409,33 @@
   buildCounterAnalyze--;
 }
 
-buildUnnamed1894() {
+buildUnnamed1892() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed1894(core.List<core.Object> o) {
+checkUnnamed1892(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterInputInput = 0;
@@ -420,7 +443,7 @@
   var o = new api.InputInput();
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    o.csvInstance = buildUnnamed1894();
+    o.csvInstance = buildUnnamed1892();
   }
   buildCounterInputInput--;
   return o;
@@ -429,7 +452,7 @@
 checkInputInput(api.InputInput o) {
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    checkUnnamed1894(o.csvInstance);
+    checkUnnamed1892(o.csvInstance);
   }
   buildCounterInputInput--;
 }
@@ -453,17 +476,33 @@
   buildCounterInput--;
 }
 
-buildUnnamed1895() {
+buildUnnamed1893() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed1895(core.List<core.Object> o) {
+checkUnnamed1893(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o[0]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o[1]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterInsertTrainingInstances = 0;
@@ -471,7 +510,7 @@
   var o = new api.InsertTrainingInstances();
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    o.csvInstance = buildUnnamed1895();
+    o.csvInstance = buildUnnamed1893();
     o.output = "foo";
   }
   buildCounterInsertTrainingInstances--;
@@ -481,49 +520,49 @@
 checkInsertTrainingInstances(api.InsertTrainingInstances o) {
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    checkUnnamed1895(o.csvInstance);
+    checkUnnamed1893(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterInsertTrainingInstances--;
 }
 
-buildUnnamed1896() {
+buildUnnamed1894() {
   var o = new core.List<api.InsertTrainingInstances>();
   o.add(buildInsertTrainingInstances());
   o.add(buildInsertTrainingInstances());
   return o;
 }
 
-checkUnnamed1896(core.List<api.InsertTrainingInstances> o) {
+checkUnnamed1894(core.List<api.InsertTrainingInstances> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsertTrainingInstances(o[0]);
   checkInsertTrainingInstances(o[1]);
 }
 
-buildUnnamed1897() {
+buildUnnamed1895() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed1897(core.Map<core.String, core.double> o) {
+checkUnnamed1895(core.Map<core.String, core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42.0));
   unittest.expect(o["y"], unittest.equals(42.0));
 }
 
-buildUnnamed1898() {
+buildUnnamed1896() {
   var o = new core.List<core.Map<core.String, core.double>>();
-  o.add(buildUnnamed1897());
-  o.add(buildUnnamed1897());
+  o.add(buildUnnamed1895());
+  o.add(buildUnnamed1895());
   return o;
 }
 
-checkUnnamed1898(core.List<core.Map<core.String, core.double>> o) {
+checkUnnamed1896(core.List<core.Map<core.String, core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1897(o[0]);
-  checkUnnamed1897(o[1]);
+  checkUnnamed1895(o[0]);
+  checkUnnamed1895(o[1]);
 }
 
 core.int buildCounterInsert = 0;
@@ -537,8 +576,8 @@
     o.storageDataLocation = "foo";
     o.storagePMMLLocation = "foo";
     o.storagePMMLModelLocation = "foo";
-    o.trainingInstances = buildUnnamed1896();
-    o.utility = buildUnnamed1898();
+    o.trainingInstances = buildUnnamed1894();
+    o.utility = buildUnnamed1896();
   }
   buildCounterInsert--;
   return o;
@@ -553,8 +592,8 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    checkUnnamed1896(o.trainingInstances);
-    checkUnnamed1898(o.utility);
+    checkUnnamed1894(o.trainingInstances);
+    checkUnnamed1896(o.utility);
   }
   buildCounterInsert--;
 }
@@ -612,7 +651,8 @@
 checkInsert2(api.Insert2 o) {
   buildCounterInsert2++;
   if (buildCounterInsert2 < 3) {
-    unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkInsert2ModelInfo(o.modelInfo);
@@ -621,20 +661,21 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    unittest.expect(o.trainingComplete, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.trainingComplete,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.trainingStatus, unittest.equals('foo'));
   }
   buildCounterInsert2--;
 }
 
-buildUnnamed1899() {
+buildUnnamed1897() {
   var o = new core.List<api.Insert2>();
   o.add(buildInsert2());
   o.add(buildInsert2());
   return o;
 }
 
-checkUnnamed1899(core.List<api.Insert2> o) {
+checkUnnamed1897(core.List<api.Insert2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsert2(o[0]);
   checkInsert2(o[1]);
@@ -645,7 +686,7 @@
   var o = new api.List();
   buildCounterList++;
   if (buildCounterList < 3) {
-    o.items = buildUnnamed1899();
+    o.items = buildUnnamed1897();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -657,7 +698,7 @@
 checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkUnnamed1899(o.items);
+    checkUnnamed1897(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -686,14 +727,14 @@
   buildCounterOutputOutputMulti--;
 }
 
-buildUnnamed1900() {
+buildUnnamed1898() {
   var o = new core.List<api.OutputOutputMulti>();
   o.add(buildOutputOutputMulti());
   o.add(buildOutputOutputMulti());
   return o;
 }
 
-checkUnnamed1900(core.List<api.OutputOutputMulti> o) {
+checkUnnamed1898(core.List<api.OutputOutputMulti> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOutputOutputMulti(o[0]);
   checkOutputOutputMulti(o[1]);
@@ -707,7 +748,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.outputLabel = "foo";
-    o.outputMulti = buildUnnamed1900();
+    o.outputMulti = buildUnnamed1898();
     o.outputValue = "foo";
     o.selfLink = "foo";
   }
@@ -721,24 +762,40 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.outputLabel, unittest.equals('foo'));
-    checkUnnamed1900(o.outputMulti);
+    checkUnnamed1898(o.outputMulti);
     unittest.expect(o.outputValue, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterOutput--;
 }
 
-buildUnnamed1901() {
+buildUnnamed1899() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed1901(core.List<core.Object> o) {
+checkUnnamed1899(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o[0]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o[1]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterUpdate = 0;
@@ -746,7 +803,7 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    o.csvInstance = buildUnnamed1901();
+    o.csvInstance = buildUnnamed1899();
     o.output = "foo";
   }
   buildCounterUpdate--;
@@ -756,41 +813,41 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    checkUnnamed1901(o.csvInstance);
+    checkUnnamed1899(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterUpdate--;
 }
 
-
 main() {
-  unittest.group("obj-schema-AnalyzeDataDescriptionFeaturesCategoricalValues", () {
+  unittest.group("obj-schema-AnalyzeDataDescriptionFeaturesCategoricalValues",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionFeaturesCategoricalValues();
-      var od = new api.AnalyzeDataDescriptionFeaturesCategoricalValues.fromJson(o.toJson());
+      var od = new api.AnalyzeDataDescriptionFeaturesCategoricalValues.fromJson(
+          o.toJson());
       checkAnalyzeDataDescriptionFeaturesCategoricalValues(od);
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionFeaturesCategorical", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionFeaturesCategorical();
-      var od = new api.AnalyzeDataDescriptionFeaturesCategorical.fromJson(o.toJson());
+      var od = new api.AnalyzeDataDescriptionFeaturesCategorical.fromJson(
+          o.toJson());
       checkAnalyzeDataDescriptionFeaturesCategorical(od);
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionFeaturesNumeric", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionFeaturesNumeric();
-      var od = new api.AnalyzeDataDescriptionFeaturesNumeric.fromJson(o.toJson());
+      var od =
+          new api.AnalyzeDataDescriptionFeaturesNumeric.fromJson(o.toJson());
       checkAnalyzeDataDescriptionFeaturesNumeric(od);
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionFeaturesText", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionFeaturesText();
@@ -799,7 +856,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionFeatures", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionFeatures();
@@ -808,25 +864,24 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionOutputFeatureNumeric", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-      var od = new api.AnalyzeDataDescriptionOutputFeatureNumeric.fromJson(o.toJson());
+      var od = new api.AnalyzeDataDescriptionOutputFeatureNumeric.fromJson(
+          o.toJson());
       checkAnalyzeDataDescriptionOutputFeatureNumeric(od);
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionOutputFeatureText", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionOutputFeatureText();
-      var od = new api.AnalyzeDataDescriptionOutputFeatureText.fromJson(o.toJson());
+      var od =
+          new api.AnalyzeDataDescriptionOutputFeatureText.fromJson(o.toJson());
       checkAnalyzeDataDescriptionOutputFeatureText(od);
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescriptionOutputFeature", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescriptionOutputFeature();
@@ -835,7 +890,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeDataDescription", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeDataDescription();
@@ -844,7 +898,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyzeModelDescription", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyzeModelDescription();
@@ -853,7 +906,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Analyze", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyze();
@@ -862,7 +914,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InputInput", () {
     unittest.test("to-json--from-json", () {
       var o = buildInputInput();
@@ -871,7 +922,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Input", () {
     unittest.test("to-json--from-json", () {
       var o = buildInput();
@@ -880,7 +930,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InsertTrainingInstances", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsertTrainingInstances();
@@ -889,7 +938,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Insert", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsert();
@@ -898,7 +946,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Insert2ModelInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsert2ModelInfo();
@@ -907,7 +954,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Insert2", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsert2();
@@ -916,7 +962,6 @@
     });
   });
 
-
   unittest.group("obj-schema-List", () {
     unittest.test("to-json--from-json", () {
       var o = buildList();
@@ -925,7 +970,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OutputOutputMulti", () {
     unittest.test("to-json--from-json", () {
       var o = buildOutputOutputMulti();
@@ -934,7 +978,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Output", () {
     unittest.test("to-json--from-json", () {
       var o = buildOutput();
@@ -943,7 +986,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Update", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdate();
@@ -952,12 +994,11 @@
     });
   });
 
-
   unittest.group("resource-HostedmodelsResourceApi", () {
     unittest.test("method--predict", () {
-
       var mock = new HttpServerMock();
-      api.HostedmodelsResourceApi res = new api.PredictionApi(mock).hostedmodels;
+      api.HostedmodelsResourceApi res =
+          new api.PredictionApi(mock).hostedmodels;
       var arg_request = buildInput();
       var arg_project = "foo";
       var arg_hostedModelName = "foo";
@@ -969,7 +1010,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -982,33 +1024,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOutput());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.predict(arg_request, arg_project, arg_hostedModelName).then(unittest.expectAsync1(((api.Output response) {
+      res
+          .predict(arg_request, arg_project, arg_hostedModelName)
+          .then(unittest.expectAsync1(((api.Output response) {
         checkOutput(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TrainedmodelsResourceApi", () {
     unittest.test("method--analyze", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_project = "foo";
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1016,7 +1059,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1029,29 +1073,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAnalyze());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.analyze(arg_project, arg_id).then(unittest.expectAsync1(((api.Analyze response) {
+      res
+          .analyze(arg_project, arg_id)
+          .then(unittest.expectAsync1(((api.Analyze response) {
         checkAnalyze(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_project = "foo";
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1059,7 +1106,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1072,16 +1120,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1090,9 +1139,9 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_project = "foo";
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1100,7 +1149,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1113,29 +1163,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInsert2());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_project, arg_id).then(unittest.expectAsync1(((api.Insert2 response) {
+      res
+          .get(arg_project, arg_id)
+          .then(unittest.expectAsync1(((api.Insert2 response) {
         checkInsert2(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_request = buildInsert();
       var arg_project = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1146,7 +1199,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1159,29 +1213,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInsert2());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_project).then(unittest.expectAsync1(((api.Insert2 response) {
+      res
+          .insert(arg_request, arg_project)
+          .then(unittest.expectAsync1(((api.Insert2 response) {
         checkInsert2(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_project = "foo";
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
@@ -1190,7 +1247,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1203,31 +1261,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.List response) {
+      res
+          .list(arg_project,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.List response) {
         checkList(response);
       })));
     });
 
     unittest.test("method--predict", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_request = buildInput();
       var arg_project = "foo";
       var arg_id = "foo";
@@ -1239,7 +1303,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1252,29 +1317,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOutput());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.predict(arg_request, arg_project, arg_id).then(unittest.expectAsync1(((api.Output response) {
+      res
+          .predict(arg_request, arg_project, arg_id)
+          .then(unittest.expectAsync1(((api.Output response) {
         checkOutput(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.TrainedmodelsResourceApi res = new api.PredictionApi(mock).trainedmodels;
+      api.TrainedmodelsResourceApi res =
+          new api.PredictionApi(mock).trainedmodels;
       var arg_request = buildUpdate();
       var arg_project = "foo";
       var arg_id = "foo";
@@ -1286,7 +1354,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
 
         var query = (req.url).query;
@@ -1299,27 +1368,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInsert2());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_project, arg_id).then(unittest.expectAsync1(((api.Insert2 response) {
+      res
+          .update(arg_request, arg_project, arg_id)
+          .then(unittest.expectAsync1(((api.Insert2 response) {
         checkInsert2(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/pubsub/v1_test.dart b/generated/googleapis/test/pubsub/v1_test.dart
index f49da32..52f12ed 100644
--- a/generated/googleapis/test/pubsub/v1_test.dart
+++ b/generated/googleapis/test/pubsub/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.pubsub.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/pubsub/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1273() {
+buildUnnamed1269() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1273(core.List<core.String> o) {
+checkUnnamed1269(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -69,7 +68,7 @@
   var o = new api.AcknowledgeRequest();
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    o.ackIds = buildUnnamed1273();
+    o.ackIds = buildUnnamed1269();
   }
   buildCounterAcknowledgeRequest--;
   return o;
@@ -78,11 +77,162 @@
 checkAcknowledgeRequest(api.AcknowledgeRequest o) {
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    checkUnnamed1273(o.ackIds);
+    checkUnnamed1269(o.ackIds);
   }
   buildCounterAcknowledgeRequest--;
 }
 
+buildUnnamed1270() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1270(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterBinding = 0;
+buildBinding() {
+  var o = new api.Binding();
+  buildCounterBinding++;
+  if (buildCounterBinding < 3) {
+    o.members = buildUnnamed1270();
+    o.role = "foo";
+  }
+  buildCounterBinding--;
+  return o;
+}
+
+checkBinding(api.Binding o) {
+  buildCounterBinding++;
+  if (buildCounterBinding < 3) {
+    checkUnnamed1270(o.members);
+    unittest.expect(o.role, unittest.equals('foo'));
+  }
+  buildCounterBinding--;
+}
+
+core.int buildCounterEmpty = 0;
+buildEmpty() {
+  var o = new api.Empty();
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+  return o;
+}
+
+checkEmpty(api.Empty o) {
+  buildCounterEmpty++;
+  if (buildCounterEmpty < 3) {}
+  buildCounterEmpty--;
+}
+
+buildUnnamed1271() {
+  var o = new core.List<api.Subscription>();
+  o.add(buildSubscription());
+  o.add(buildSubscription());
+  return o;
+}
+
+checkUnnamed1271(core.List<api.Subscription> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSubscription(o[0]);
+  checkSubscription(o[1]);
+}
+
+core.int buildCounterListSubscriptionsResponse = 0;
+buildListSubscriptionsResponse() {
+  var o = new api.ListSubscriptionsResponse();
+  buildCounterListSubscriptionsResponse++;
+  if (buildCounterListSubscriptionsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.subscriptions = buildUnnamed1271();
+  }
+  buildCounterListSubscriptionsResponse--;
+  return o;
+}
+
+checkListSubscriptionsResponse(api.ListSubscriptionsResponse o) {
+  buildCounterListSubscriptionsResponse++;
+  if (buildCounterListSubscriptionsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1271(o.subscriptions);
+  }
+  buildCounterListSubscriptionsResponse--;
+}
+
+buildUnnamed1272() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1272(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterListTopicSubscriptionsResponse = 0;
+buildListTopicSubscriptionsResponse() {
+  var o = new api.ListTopicSubscriptionsResponse();
+  buildCounterListTopicSubscriptionsResponse++;
+  if (buildCounterListTopicSubscriptionsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.subscriptions = buildUnnamed1272();
+  }
+  buildCounterListTopicSubscriptionsResponse--;
+  return o;
+}
+
+checkListTopicSubscriptionsResponse(api.ListTopicSubscriptionsResponse o) {
+  buildCounterListTopicSubscriptionsResponse++;
+  if (buildCounterListTopicSubscriptionsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1272(o.subscriptions);
+  }
+  buildCounterListTopicSubscriptionsResponse--;
+}
+
+buildUnnamed1273() {
+  var o = new core.List<api.Topic>();
+  o.add(buildTopic());
+  o.add(buildTopic());
+  return o;
+}
+
+checkUnnamed1273(core.List<api.Topic> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTopic(o[0]);
+  checkTopic(o[1]);
+}
+
+core.int buildCounterListTopicsResponse = 0;
+buildListTopicsResponse() {
+  var o = new api.ListTopicsResponse();
+  buildCounterListTopicsResponse++;
+  if (buildCounterListTopicsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.topics = buildUnnamed1273();
+  }
+  buildCounterListTopicsResponse--;
+  return o;
+}
+
+checkListTopicsResponse(api.ListTopicsResponse o) {
+  buildCounterListTopicsResponse++;
+  if (buildCounterListTopicsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1273(o.topics);
+  }
+  buildCounterListTopicsResponse--;
+}
+
 buildUnnamed1274() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -96,166 +246,13 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterBinding = 0;
-buildBinding() {
-  var o = new api.Binding();
-  buildCounterBinding++;
-  if (buildCounterBinding < 3) {
-    o.members = buildUnnamed1274();
-    o.role = "foo";
-  }
-  buildCounterBinding--;
-  return o;
-}
-
-checkBinding(api.Binding o) {
-  buildCounterBinding++;
-  if (buildCounterBinding < 3) {
-    checkUnnamed1274(o.members);
-    unittest.expect(o.role, unittest.equals('foo'));
-  }
-  buildCounterBinding--;
-}
-
-core.int buildCounterEmpty = 0;
-buildEmpty() {
-  var o = new api.Empty();
-  buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
-  buildCounterEmpty--;
-  return o;
-}
-
-checkEmpty(api.Empty o) {
-  buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
-  buildCounterEmpty--;
-}
-
-buildUnnamed1275() {
-  var o = new core.List<api.Subscription>();
-  o.add(buildSubscription());
-  o.add(buildSubscription());
-  return o;
-}
-
-checkUnnamed1275(core.List<api.Subscription> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSubscription(o[0]);
-  checkSubscription(o[1]);
-}
-
-core.int buildCounterListSubscriptionsResponse = 0;
-buildListSubscriptionsResponse() {
-  var o = new api.ListSubscriptionsResponse();
-  buildCounterListSubscriptionsResponse++;
-  if (buildCounterListSubscriptionsResponse < 3) {
-    o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed1275();
-  }
-  buildCounterListSubscriptionsResponse--;
-  return o;
-}
-
-checkListSubscriptionsResponse(api.ListSubscriptionsResponse o) {
-  buildCounterListSubscriptionsResponse++;
-  if (buildCounterListSubscriptionsResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1275(o.subscriptions);
-  }
-  buildCounterListSubscriptionsResponse--;
-}
-
-buildUnnamed1276() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1276(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterListTopicSubscriptionsResponse = 0;
-buildListTopicSubscriptionsResponse() {
-  var o = new api.ListTopicSubscriptionsResponse();
-  buildCounterListTopicSubscriptionsResponse++;
-  if (buildCounterListTopicSubscriptionsResponse < 3) {
-    o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed1276();
-  }
-  buildCounterListTopicSubscriptionsResponse--;
-  return o;
-}
-
-checkListTopicSubscriptionsResponse(api.ListTopicSubscriptionsResponse o) {
-  buildCounterListTopicSubscriptionsResponse++;
-  if (buildCounterListTopicSubscriptionsResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1276(o.subscriptions);
-  }
-  buildCounterListTopicSubscriptionsResponse--;
-}
-
-buildUnnamed1277() {
-  var o = new core.List<api.Topic>();
-  o.add(buildTopic());
-  o.add(buildTopic());
-  return o;
-}
-
-checkUnnamed1277(core.List<api.Topic> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkTopic(o[0]);
-  checkTopic(o[1]);
-}
-
-core.int buildCounterListTopicsResponse = 0;
-buildListTopicsResponse() {
-  var o = new api.ListTopicsResponse();
-  buildCounterListTopicsResponse++;
-  if (buildCounterListTopicsResponse < 3) {
-    o.nextPageToken = "foo";
-    o.topics = buildUnnamed1277();
-  }
-  buildCounterListTopicsResponse--;
-  return o;
-}
-
-checkListTopicsResponse(api.ListTopicsResponse o) {
-  buildCounterListTopicsResponse++;
-  if (buildCounterListTopicsResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1277(o.topics);
-  }
-  buildCounterListTopicsResponse--;
-}
-
-buildUnnamed1278() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1278(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterModifyAckDeadlineRequest = 0;
 buildModifyAckDeadlineRequest() {
   var o = new api.ModifyAckDeadlineRequest();
   buildCounterModifyAckDeadlineRequest++;
   if (buildCounterModifyAckDeadlineRequest < 3) {
     o.ackDeadlineSeconds = 42;
-    o.ackIds = buildUnnamed1278();
+    o.ackIds = buildUnnamed1274();
   }
   buildCounterModifyAckDeadlineRequest--;
   return o;
@@ -265,7 +262,7 @@
   buildCounterModifyAckDeadlineRequest++;
   if (buildCounterModifyAckDeadlineRequest < 3) {
     unittest.expect(o.ackDeadlineSeconds, unittest.equals(42));
-    checkUnnamed1278(o.ackIds);
+    checkUnnamed1274(o.ackIds);
   }
   buildCounterModifyAckDeadlineRequest--;
 }
@@ -289,14 +286,14 @@
   buildCounterModifyPushConfigRequest--;
 }
 
-buildUnnamed1279() {
+buildUnnamed1275() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1279(core.List<api.Binding> o) {
+checkUnnamed1275(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
@@ -307,7 +304,7 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.bindings = buildUnnamed1279();
+    o.bindings = buildUnnamed1275();
     o.etag = "foo";
     o.version = 42;
   }
@@ -318,21 +315,21 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1279(o.bindings);
+    checkUnnamed1275(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed1280() {
+buildUnnamed1276() {
   var o = new core.List<api.PubsubMessage>();
   o.add(buildPubsubMessage());
   o.add(buildPubsubMessage());
   return o;
 }
 
-checkUnnamed1280(core.List<api.PubsubMessage> o) {
+checkUnnamed1276(core.List<api.PubsubMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPubsubMessage(o[0]);
   checkPubsubMessage(o[1]);
@@ -343,7 +340,7 @@
   var o = new api.PublishRequest();
   buildCounterPublishRequest++;
   if (buildCounterPublishRequest < 3) {
-    o.messages = buildUnnamed1280();
+    o.messages = buildUnnamed1276();
   }
   buildCounterPublishRequest--;
   return o;
@@ -352,19 +349,19 @@
 checkPublishRequest(api.PublishRequest o) {
   buildCounterPublishRequest++;
   if (buildCounterPublishRequest < 3) {
-    checkUnnamed1280(o.messages);
+    checkUnnamed1276(o.messages);
   }
   buildCounterPublishRequest--;
 }
 
-buildUnnamed1281() {
+buildUnnamed1277() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1281(core.List<core.String> o) {
+checkUnnamed1277(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -375,7 +372,7 @@
   var o = new api.PublishResponse();
   buildCounterPublishResponse++;
   if (buildCounterPublishResponse < 3) {
-    o.messageIds = buildUnnamed1281();
+    o.messageIds = buildUnnamed1277();
   }
   buildCounterPublishResponse--;
   return o;
@@ -384,19 +381,19 @@
 checkPublishResponse(api.PublishResponse o) {
   buildCounterPublishResponse++;
   if (buildCounterPublishResponse < 3) {
-    checkUnnamed1281(o.messageIds);
+    checkUnnamed1277(o.messageIds);
   }
   buildCounterPublishResponse--;
 }
 
-buildUnnamed1282() {
+buildUnnamed1278() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1282(core.Map<core.String, core.String> o) {
+checkUnnamed1278(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -407,7 +404,7 @@
   var o = new api.PubsubMessage();
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
-    o.attributes = buildUnnamed1282();
+    o.attributes = buildUnnamed1278();
     o.data = "foo";
     o.messageId = "foo";
     o.publishTime = "foo";
@@ -419,7 +416,7 @@
 checkPubsubMessage(api.PubsubMessage o) {
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
-    checkUnnamed1282(o.attributes);
+    checkUnnamed1278(o.attributes);
     unittest.expect(o.data, unittest.equals('foo'));
     unittest.expect(o.messageId, unittest.equals('foo'));
     unittest.expect(o.publishTime, unittest.equals('foo'));
@@ -448,14 +445,14 @@
   buildCounterPullRequest--;
 }
 
-buildUnnamed1283() {
+buildUnnamed1279() {
   var o = new core.List<api.ReceivedMessage>();
   o.add(buildReceivedMessage());
   o.add(buildReceivedMessage());
   return o;
 }
 
-checkUnnamed1283(core.List<api.ReceivedMessage> o) {
+checkUnnamed1279(core.List<api.ReceivedMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReceivedMessage(o[0]);
   checkReceivedMessage(o[1]);
@@ -466,7 +463,7 @@
   var o = new api.PullResponse();
   buildCounterPullResponse++;
   if (buildCounterPullResponse < 3) {
-    o.receivedMessages = buildUnnamed1283();
+    o.receivedMessages = buildUnnamed1279();
   }
   buildCounterPullResponse--;
   return o;
@@ -475,19 +472,19 @@
 checkPullResponse(api.PullResponse o) {
   buildCounterPullResponse++;
   if (buildCounterPullResponse < 3) {
-    checkUnnamed1283(o.receivedMessages);
+    checkUnnamed1279(o.receivedMessages);
   }
   buildCounterPullResponse--;
 }
 
-buildUnnamed1284() {
+buildUnnamed1280() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1284(core.Map<core.String, core.String> o) {
+checkUnnamed1280(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -498,7 +495,7 @@
   var o = new api.PushConfig();
   buildCounterPushConfig++;
   if (buildCounterPushConfig < 3) {
-    o.attributes = buildUnnamed1284();
+    o.attributes = buildUnnamed1280();
     o.pushEndpoint = "foo";
   }
   buildCounterPushConfig--;
@@ -508,7 +505,7 @@
 checkPushConfig(api.PushConfig o) {
   buildCounterPushConfig++;
   if (buildCounterPushConfig < 3) {
-    checkUnnamed1284(o.attributes);
+    checkUnnamed1280(o.attributes);
     unittest.expect(o.pushEndpoint, unittest.equals('foo'));
   }
   buildCounterPushConfig--;
@@ -579,14 +576,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed1285() {
+buildUnnamed1281() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1285(core.List<core.String> o) {
+checkUnnamed1281(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -597,7 +594,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1285();
+    o.permissions = buildUnnamed1281();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -606,19 +603,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1285(o.permissions);
+    checkUnnamed1281(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed1286() {
+buildUnnamed1282() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1286(core.List<core.String> o) {
+checkUnnamed1282(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -629,7 +626,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1286();
+    o.permissions = buildUnnamed1282();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -638,7 +635,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1286(o.permissions);
+    checkUnnamed1282(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -662,7 +659,6 @@
   buildCounterTopic--;
 }
 
-
 main() {
   unittest.group("obj-schema-AcknowledgeRequest", () {
     unittest.test("to-json--from-json", () {
@@ -672,7 +668,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -681,7 +676,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -690,7 +684,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListSubscriptionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListSubscriptionsResponse();
@@ -699,7 +692,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListTopicSubscriptionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListTopicSubscriptionsResponse();
@@ -708,7 +700,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListTopicsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListTopicsResponse();
@@ -717,7 +708,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ModifyAckDeadlineRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildModifyAckDeadlineRequest();
@@ -726,7 +716,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ModifyPushConfigRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildModifyPushConfigRequest();
@@ -735,7 +724,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -744,7 +732,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PublishRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildPublishRequest();
@@ -753,7 +740,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PublishResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPublishResponse();
@@ -762,7 +748,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PubsubMessage", () {
     unittest.test("to-json--from-json", () {
       var o = buildPubsubMessage();
@@ -771,7 +756,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PullRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildPullRequest();
@@ -780,7 +764,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PullResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPullResponse();
@@ -789,7 +772,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PushConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildPushConfig();
@@ -798,7 +780,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReceivedMessage", () {
     unittest.test("to-json--from-json", () {
       var o = buildReceivedMessage();
@@ -807,7 +788,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -816,7 +796,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Subscription", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscription();
@@ -825,7 +804,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -834,7 +812,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -843,7 +820,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Topic", () {
     unittest.test("to-json--from-json", () {
       var o = buildTopic();
@@ -852,21 +828,22 @@
     });
   });
 
-
   unittest.group("resource-ProjectsSnapshotsResourceApi", () {
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSnapshotsResourceApi res = new api.PubsubApi(mock).projects.snapshots;
+      api.ProjectsSnapshotsResourceApi res =
+          new api.PubsubApi(mock).projects.snapshots;
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -880,29 +857,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSnapshotsResourceApi res = new api.PubsubApi(mock).projects.snapshots;
+      api.ProjectsSnapshotsResourceApi res =
+          new api.PubsubApi(mock).projects.snapshots;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -913,9 +893,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -929,29 +911,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSnapshotsResourceApi res = new api.PubsubApi(mock).projects.snapshots;
+      api.ProjectsSnapshotsResourceApi res =
+          new api.PubsubApi(mock).projects.snapshots;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -962,9 +947,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -978,33 +965,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsSubscriptionsResourceApi", () {
     unittest.test("method--acknowledge", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildAcknowledgeRequest();
       var arg_subscription = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1015,9 +1002,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1031,29 +1020,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.acknowledge(arg_request, arg_subscription).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .acknowledge(arg_request, arg_subscription)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildSubscription();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1064,9 +1056,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1080,38 +1074,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_name).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .create(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_subscription = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1125,38 +1124,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_subscription).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_subscription)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_subscription = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1170,38 +1174,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_subscription).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .get(arg_subscription)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1215,40 +1224,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_project = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1262,31 +1276,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListSubscriptionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListSubscriptionsResponse response) {
+      res
+          .list(arg_project, pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(
+              unittest.expectAsync1(((api.ListSubscriptionsResponse response) {
         checkListSubscriptionsResponse(response);
       })));
     });
 
     unittest.test("method--modifyAckDeadline", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildModifyAckDeadlineRequest();
       var arg_subscription = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1297,9 +1317,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1313,29 +1335,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.modifyAckDeadline(arg_request, arg_subscription).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .modifyAckDeadline(arg_request, arg_subscription)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--modifyPushConfig", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildModifyPushConfigRequest();
       var arg_subscription = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1346,9 +1371,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1362,29 +1389,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.modifyPushConfig(arg_request, arg_subscription).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .modifyPushConfig(arg_request, arg_subscription)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--pull", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildPullRequest();
       var arg_subscription = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1395,9 +1425,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1411,29 +1443,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPullResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.pull(arg_request, arg_subscription).then(unittest.expectAsync1(((api.PullResponse response) {
+      res
+          .pull(arg_request, arg_subscription)
+          .then(unittest.expectAsync1(((api.PullResponse response) {
         checkPullResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1444,9 +1479,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1460,29 +1497,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.subscriptions;
+      api.ProjectsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.subscriptions;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1493,9 +1533,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1509,33 +1551,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsTopicsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_request = buildTopic();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1546,9 +1588,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1562,38 +1606,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTopic());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_name).then(unittest.expectAsync1(((api.Topic response) {
+      res
+          .create(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Topic response) {
         checkTopic(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_topic = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1607,16 +1656,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1627,18 +1677,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_topic = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1652,16 +1704,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTopic());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1672,18 +1725,20 @@
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1697,29 +1752,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_project = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -1728,9 +1786,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1744,31 +1804,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListTopicsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_project, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListTopicsResponse response) {
+      res
+          .list(arg_project, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListTopicsResponse response) {
         checkListTopicsResponse(response);
       })));
     });
 
     unittest.test("method--publish", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_request = buildPublishRequest();
       var arg_topic = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1779,9 +1844,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1795,29 +1862,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPublishResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.publish(arg_request, arg_topic).then(unittest.expectAsync1(((api.PublishResponse response) {
+      res
+          .publish(arg_request, arg_topic)
+          .then(unittest.expectAsync1(((api.PublishResponse response) {
         checkPublishResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1828,9 +1898,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1844,29 +1916,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsResourceApi res = new api.PubsubApi(mock).projects.topics;
+      api.ProjectsTopicsResourceApi res =
+          new api.PubsubApi(mock).projects.topics;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1877,9 +1952,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1893,44 +1970,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsTopicsSubscriptionsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsTopicsSubscriptionsResourceApi res = new api.PubsubApi(mock).projects.topics.subscriptions;
+      api.ProjectsTopicsSubscriptionsResourceApi res =
+          new api.PubsubApi(mock).projects.topics.subscriptions;
       var arg_topic = "foo";
-      var arg_pageSize = 42;
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1944,29 +2023,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListTopicSubscriptionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_topic, pageSize: arg_pageSize, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListTopicSubscriptionsResponse response) {
+      res
+          .list(arg_topic, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.ListTopicSubscriptionsResponse response) {
         checkListTopicSubscriptionsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/qpxexpress/v1_test.dart b/generated/googleapis/test/qpxexpress/v1_test.dart
index fa563bf..dc50174 100644
--- a/generated/googleapis/test/qpxexpress/v1_test.dart
+++ b/generated/googleapis/test/qpxexpress/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.qpxExpress.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/qpxexpress/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -99,14 +98,14 @@
   buildCounterAirportData--;
 }
 
-buildUnnamed35() {
+buildUnnamed28() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed35(core.List<core.String> o) {
+checkUnnamed28(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -119,7 +118,7 @@
   if (buildCounterBagDescriptor < 3) {
     o.commercialName = "foo";
     o.count = 42;
-    o.description = buildUnnamed35();
+    o.description = buildUnnamed28();
     o.kind = "foo";
     o.subcode = "foo";
   }
@@ -132,7 +131,7 @@
   if (buildCounterBagDescriptor < 3) {
     unittest.expect(o.commercialName, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals(42));
-    checkUnnamed35(o.description);
+    checkUnnamed28(o.description);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.subcode, unittest.equals('foo'));
   }
@@ -187,66 +186,66 @@
   buildCounterCityData--;
 }
 
-buildUnnamed36() {
+buildUnnamed29() {
   var o = new core.List<api.AircraftData>();
   o.add(buildAircraftData());
   o.add(buildAircraftData());
   return o;
 }
 
-checkUnnamed36(core.List<api.AircraftData> o) {
+checkUnnamed29(core.List<api.AircraftData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAircraftData(o[0]);
   checkAircraftData(o[1]);
 }
 
-buildUnnamed37() {
+buildUnnamed30() {
   var o = new core.List<api.AirportData>();
   o.add(buildAirportData());
   o.add(buildAirportData());
   return o;
 }
 
-checkUnnamed37(core.List<api.AirportData> o) {
+checkUnnamed30(core.List<api.AirportData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAirportData(o[0]);
   checkAirportData(o[1]);
 }
 
-buildUnnamed38() {
+buildUnnamed31() {
   var o = new core.List<api.CarrierData>();
   o.add(buildCarrierData());
   o.add(buildCarrierData());
   return o;
 }
 
-checkUnnamed38(core.List<api.CarrierData> o) {
+checkUnnamed31(core.List<api.CarrierData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCarrierData(o[0]);
   checkCarrierData(o[1]);
 }
 
-buildUnnamed39() {
+buildUnnamed32() {
   var o = new core.List<api.CityData>();
   o.add(buildCityData());
   o.add(buildCityData());
   return o;
 }
 
-checkUnnamed39(core.List<api.CityData> o) {
+checkUnnamed32(core.List<api.CityData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCityData(o[0]);
   checkCityData(o[1]);
 }
 
-buildUnnamed40() {
+buildUnnamed33() {
   var o = new core.List<api.TaxData>();
   o.add(buildTaxData());
   o.add(buildTaxData());
   return o;
 }
 
-checkUnnamed40(core.List<api.TaxData> o) {
+checkUnnamed33(core.List<api.TaxData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxData(o[0]);
   checkTaxData(o[1]);
@@ -257,12 +256,12 @@
   var o = new api.Data();
   buildCounterData++;
   if (buildCounterData < 3) {
-    o.aircraft = buildUnnamed36();
-    o.airport = buildUnnamed37();
-    o.carrier = buildUnnamed38();
-    o.city = buildUnnamed39();
+    o.aircraft = buildUnnamed29();
+    o.airport = buildUnnamed30();
+    o.carrier = buildUnnamed31();
+    o.city = buildUnnamed32();
     o.kind = "foo";
-    o.tax = buildUnnamed40();
+    o.tax = buildUnnamed33();
   }
   buildCounterData--;
   return o;
@@ -271,12 +270,12 @@
 checkData(api.Data o) {
   buildCounterData++;
   if (buildCounterData < 3) {
-    checkUnnamed36(o.aircraft);
-    checkUnnamed37(o.airport);
-    checkUnnamed38(o.carrier);
-    checkUnnamed39(o.city);
+    checkUnnamed29(o.aircraft);
+    checkUnnamed30(o.airport);
+    checkUnnamed31(o.carrier);
+    checkUnnamed32(o.city);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed40(o.tax);
+    checkUnnamed33(o.tax);
   }
   buildCounterData--;
 }
@@ -333,14 +332,14 @@
   buildCounterFlightInfo--;
 }
 
-buildUnnamed41() {
+buildUnnamed34() {
   var o = new core.List<api.BagDescriptor>();
   o.add(buildBagDescriptor());
   o.add(buildBagDescriptor());
   return o;
 }
 
-checkUnnamed41(core.List<api.BagDescriptor> o) {
+checkUnnamed34(core.List<api.BagDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBagDescriptor(o[0]);
   checkBagDescriptor(o[1]);
@@ -351,7 +350,7 @@
   var o = new api.FreeBaggageAllowance();
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    o.bagDescriptor = buildUnnamed41();
+    o.bagDescriptor = buildUnnamed34();
     o.kilos = 42;
     o.kilosPerPiece = 42;
     o.kind = "foo";
@@ -365,7 +364,7 @@
 checkFreeBaggageAllowance(api.FreeBaggageAllowance o) {
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    checkUnnamed41(o.bagDescriptor);
+    checkUnnamed34(o.bagDescriptor);
     unittest.expect(o.kilos, unittest.equals(42));
     unittest.expect(o.kilosPerPiece, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -455,40 +454,40 @@
   buildCounterPassengerCounts--;
 }
 
-buildUnnamed42() {
+buildUnnamed35() {
   var o = new core.List<api.FareInfo>();
   o.add(buildFareInfo());
   o.add(buildFareInfo());
   return o;
 }
 
-checkUnnamed42(core.List<api.FareInfo> o) {
+checkUnnamed35(core.List<api.FareInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFareInfo(o[0]);
   checkFareInfo(o[1]);
 }
 
-buildUnnamed43() {
+buildUnnamed36() {
   var o = new core.List<api.SegmentPricing>();
   o.add(buildSegmentPricing());
   o.add(buildSegmentPricing());
   return o;
 }
 
-checkUnnamed43(core.List<api.SegmentPricing> o) {
+checkUnnamed36(core.List<api.SegmentPricing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentPricing(o[0]);
   checkSegmentPricing(o[1]);
 }
 
-buildUnnamed44() {
+buildUnnamed37() {
   var o = new core.List<api.TaxInfo>();
   o.add(buildTaxInfo());
   o.add(buildTaxInfo());
   return o;
 }
 
-checkUnnamed44(core.List<api.TaxInfo> o) {
+checkUnnamed37(core.List<api.TaxInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxInfo(o[0]);
   checkTaxInfo(o[1]);
@@ -500,7 +499,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     o.baseFareTotal = "foo";
-    o.fare = buildUnnamed42();
+    o.fare = buildUnnamed35();
     o.fareCalculation = "foo";
     o.kind = "foo";
     o.latestTicketingTime = "foo";
@@ -510,8 +509,8 @@
     o.saleFareTotal = "foo";
     o.saleTaxTotal = "foo";
     o.saleTotal = "foo";
-    o.segmentPricing = buildUnnamed43();
-    o.tax = buildUnnamed44();
+    o.segmentPricing = buildUnnamed36();
+    o.tax = buildUnnamed37();
   }
   buildCounterPricingInfo--;
   return o;
@@ -521,7 +520,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     unittest.expect(o.baseFareTotal, unittest.equals('foo'));
-    checkUnnamed42(o.fare);
+    checkUnnamed35(o.fare);
     unittest.expect(o.fareCalculation, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latestTicketingTime, unittest.equals('foo'));
@@ -531,20 +530,20 @@
     unittest.expect(o.saleFareTotal, unittest.equals('foo'));
     unittest.expect(o.saleTaxTotal, unittest.equals('foo'));
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed43(o.segmentPricing);
-    checkUnnamed44(o.tax);
+    checkUnnamed36(o.segmentPricing);
+    checkUnnamed37(o.tax);
   }
   buildCounterPricingInfo--;
 }
 
-buildUnnamed45() {
+buildUnnamed38() {
   var o = new core.List<api.LegInfo>();
   o.add(buildLegInfo());
   o.add(buildLegInfo());
   return o;
 }
 
-checkUnnamed45(core.List<api.LegInfo> o) {
+checkUnnamed38(core.List<api.LegInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLegInfo(o[0]);
   checkLegInfo(o[1]);
@@ -563,7 +562,7 @@
     o.flight = buildFlightInfo();
     o.id = "foo";
     o.kind = "foo";
-    o.leg = buildUnnamed45();
+    o.leg = buildUnnamed38();
     o.marriedSegmentGroup = "foo";
     o.subjectToGovernmentApproval = true;
   }
@@ -582,21 +581,21 @@
     checkFlightInfo(o.flight);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed45(o.leg);
+    checkUnnamed38(o.leg);
     unittest.expect(o.marriedSegmentGroup, unittest.equals('foo'));
     unittest.expect(o.subjectToGovernmentApproval, unittest.isTrue);
   }
   buildCounterSegmentInfo--;
 }
 
-buildUnnamed46() {
+buildUnnamed39() {
   var o = new core.List<api.FreeBaggageAllowance>();
   o.add(buildFreeBaggageAllowance());
   o.add(buildFreeBaggageAllowance());
   return o;
 }
 
-checkUnnamed46(core.List<api.FreeBaggageAllowance> o) {
+checkUnnamed39(core.List<api.FreeBaggageAllowance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBaggageAllowance(o[0]);
   checkFreeBaggageAllowance(o[1]);
@@ -608,7 +607,7 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     o.fareId = "foo";
-    o.freeBaggageOption = buildUnnamed46();
+    o.freeBaggageOption = buildUnnamed39();
     o.kind = "foo";
     o.segmentId = "foo";
   }
@@ -620,21 +619,21 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     unittest.expect(o.fareId, unittest.equals('foo'));
-    checkUnnamed46(o.freeBaggageOption);
+    checkUnnamed39(o.freeBaggageOption);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.segmentId, unittest.equals('foo'));
   }
   buildCounterSegmentPricing--;
 }
 
-buildUnnamed47() {
+buildUnnamed40() {
   var o = new core.List<api.SegmentInfo>();
   o.add(buildSegmentInfo());
   o.add(buildSegmentInfo());
   return o;
 }
 
-checkUnnamed47(core.List<api.SegmentInfo> o) {
+checkUnnamed40(core.List<api.SegmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentInfo(o[0]);
   checkSegmentInfo(o[1]);
@@ -647,7 +646,7 @@
   if (buildCounterSliceInfo < 3) {
     o.duration = 42;
     o.kind = "foo";
-    o.segment = buildUnnamed47();
+    o.segment = buildUnnamed40();
   }
   buildCounterSliceInfo--;
   return o;
@@ -658,32 +657,32 @@
   if (buildCounterSliceInfo < 3) {
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed47(o.segment);
+    checkUnnamed40(o.segment);
   }
   buildCounterSliceInfo--;
 }
 
-buildUnnamed48() {
+buildUnnamed41() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed48(core.List<core.String> o) {
+checkUnnamed41(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed49() {
+buildUnnamed42() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed49(core.List<core.String> o) {
+checkUnnamed42(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -701,10 +700,10 @@
     o.maxConnectionDuration = 42;
     o.maxStops = 42;
     o.origin = "foo";
-    o.permittedCarrier = buildUnnamed48();
+    o.permittedCarrier = buildUnnamed41();
     o.permittedDepartureTime = buildTimeOfDayRange();
     o.preferredCabin = "foo";
-    o.prohibitedCarrier = buildUnnamed49();
+    o.prohibitedCarrier = buildUnnamed42();
   }
   buildCounterSliceInput--;
   return o;
@@ -720,10 +719,10 @@
     unittest.expect(o.maxConnectionDuration, unittest.equals(42));
     unittest.expect(o.maxStops, unittest.equals(42));
     unittest.expect(o.origin, unittest.equals('foo'));
-    checkUnnamed48(o.permittedCarrier);
+    checkUnnamed41(o.permittedCarrier);
     checkTimeOfDayRange(o.permittedDepartureTime);
     unittest.expect(o.preferredCabin, unittest.equals('foo'));
-    checkUnnamed49(o.prohibitedCarrier);
+    checkUnnamed42(o.prohibitedCarrier);
   }
   buildCounterSliceInput--;
 }
@@ -803,27 +802,27 @@
   buildCounterTimeOfDayRange--;
 }
 
-buildUnnamed50() {
+buildUnnamed43() {
   var o = new core.List<api.PricingInfo>();
   o.add(buildPricingInfo());
   o.add(buildPricingInfo());
   return o;
 }
 
-checkUnnamed50(core.List<api.PricingInfo> o) {
+checkUnnamed43(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingInfo(o[0]);
   checkPricingInfo(o[1]);
 }
 
-buildUnnamed51() {
+buildUnnamed44() {
   var o = new core.List<api.SliceInfo>();
   o.add(buildSliceInfo());
   o.add(buildSliceInfo());
   return o;
 }
 
-checkUnnamed51(core.List<api.SliceInfo> o) {
+checkUnnamed44(core.List<api.SliceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInfo(o[0]);
   checkSliceInfo(o[1]);
@@ -836,9 +835,9 @@
   if (buildCounterTripOption < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.pricing = buildUnnamed50();
+    o.pricing = buildUnnamed43();
     o.saleTotal = "foo";
-    o.slice = buildUnnamed51();
+    o.slice = buildUnnamed44();
   }
   buildCounterTripOption--;
   return o;
@@ -849,21 +848,21 @@
   if (buildCounterTripOption < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed50(o.pricing);
+    checkUnnamed43(o.pricing);
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed51(o.slice);
+    checkUnnamed44(o.slice);
   }
   buildCounterTripOption--;
 }
 
-buildUnnamed52() {
+buildUnnamed45() {
   var o = new core.List<api.SliceInput>();
   o.add(buildSliceInput());
   o.add(buildSliceInput());
   return o;
 }
 
-checkUnnamed52(core.List<api.SliceInput> o) {
+checkUnnamed45(core.List<api.SliceInput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInput(o[0]);
   checkSliceInput(o[1]);
@@ -878,7 +877,7 @@
     o.passengers = buildPassengerCounts();
     o.refundable = true;
     o.saleCountry = "foo";
-    o.slice = buildUnnamed52();
+    o.slice = buildUnnamed45();
     o.solutions = 42;
     o.ticketingCountry = "foo";
   }
@@ -893,21 +892,21 @@
     checkPassengerCounts(o.passengers);
     unittest.expect(o.refundable, unittest.isTrue);
     unittest.expect(o.saleCountry, unittest.equals('foo'));
-    checkUnnamed52(o.slice);
+    checkUnnamed45(o.slice);
     unittest.expect(o.solutions, unittest.equals(42));
     unittest.expect(o.ticketingCountry, unittest.equals('foo'));
   }
   buildCounterTripOptionsRequest--;
 }
 
-buildUnnamed53() {
+buildUnnamed46() {
   var o = new core.List<api.TripOption>();
   o.add(buildTripOption());
   o.add(buildTripOption());
   return o;
 }
 
-checkUnnamed53(core.List<api.TripOption> o) {
+checkUnnamed46(core.List<api.TripOption> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTripOption(o[0]);
   checkTripOption(o[1]);
@@ -921,7 +920,7 @@
     o.data = buildData();
     o.kind = "foo";
     o.requestId = "foo";
-    o.tripOption = buildUnnamed53();
+    o.tripOption = buildUnnamed46();
   }
   buildCounterTripOptionsResponse--;
   return o;
@@ -933,7 +932,7 @@
     checkData(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed53(o.tripOption);
+    checkUnnamed46(o.tripOption);
   }
   buildCounterTripOptionsResponse--;
 }
@@ -978,7 +977,6 @@
   buildCounterTripsSearchResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-AircraftData", () {
     unittest.test("to-json--from-json", () {
@@ -988,7 +986,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AirportData", () {
     unittest.test("to-json--from-json", () {
       var o = buildAirportData();
@@ -997,7 +994,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BagDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildBagDescriptor();
@@ -1006,7 +1002,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CarrierData", () {
     unittest.test("to-json--from-json", () {
       var o = buildCarrierData();
@@ -1015,7 +1010,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CityData", () {
     unittest.test("to-json--from-json", () {
       var o = buildCityData();
@@ -1024,7 +1018,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Data", () {
     unittest.test("to-json--from-json", () {
       var o = buildData();
@@ -1033,7 +1026,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FareInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildFareInfo();
@@ -1042,7 +1034,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FlightInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildFlightInfo();
@@ -1051,7 +1042,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FreeBaggageAllowance", () {
     unittest.test("to-json--from-json", () {
       var o = buildFreeBaggageAllowance();
@@ -1060,7 +1050,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LegInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildLegInfo();
@@ -1069,7 +1058,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PassengerCounts", () {
     unittest.test("to-json--from-json", () {
       var o = buildPassengerCounts();
@@ -1078,7 +1066,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PricingInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPricingInfo();
@@ -1087,7 +1074,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentInfo();
@@ -1096,7 +1082,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SegmentPricing", () {
     unittest.test("to-json--from-json", () {
       var o = buildSegmentPricing();
@@ -1105,7 +1090,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SliceInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSliceInfo();
@@ -1114,7 +1098,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SliceInput", () {
     unittest.test("to-json--from-json", () {
       var o = buildSliceInput();
@@ -1123,7 +1106,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TaxData", () {
     unittest.test("to-json--from-json", () {
       var o = buildTaxData();
@@ -1132,7 +1114,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TaxInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildTaxInfo();
@@ -1141,7 +1122,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TimeOfDayRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimeOfDayRange();
@@ -1150,7 +1130,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TripOption", () {
     unittest.test("to-json--from-json", () {
       var o = buildTripOption();
@@ -1159,7 +1138,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TripOptionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTripOptionsRequest();
@@ -1168,7 +1146,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TripOptionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTripOptionsResponse();
@@ -1177,7 +1154,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TripsSearchRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTripsSearchRequest();
@@ -1186,7 +1162,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TripsSearchResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTripsSearchResponse();
@@ -1195,10 +1170,8 @@
     });
   });
 
-
   unittest.group("resource-TripsResourceApi", () {
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.TripsResourceApi res = new api.QpxExpressApi(mock).trips;
       var arg_request = buildTripsSearchRequest();
@@ -1210,11 +1183,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("qpxExpress/v1/trips/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("qpxExpress/v1/trips/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("search"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1227,27 +1203,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTripsSearchResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync1(((api.TripsSearchResponse response) {
+      res
+          .search(arg_request)
+          .then(unittest.expectAsync1(((api.TripsSearchResponse response) {
         checkTripsSearchResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 77bbca9..7f9f7ae 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.reseller.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/reseller/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -169,14 +168,14 @@
   buildCounterRenewalSettings--;
 }
 
-buildUnnamed2450() {
+buildUnnamed2437() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2450(core.List<core.String> o) {
+checkUnnamed2437(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -187,17 +186,18 @@
   var o = new api.ResellernotifyGetwatchdetailsResponse();
   buildCounterResellernotifyGetwatchdetailsResponse++;
   if (buildCounterResellernotifyGetwatchdetailsResponse < 3) {
-    o.serviceAccountEmailAddresses = buildUnnamed2450();
+    o.serviceAccountEmailAddresses = buildUnnamed2437();
     o.topicName = "foo";
   }
   buildCounterResellernotifyGetwatchdetailsResponse--;
   return o;
 }
 
-checkResellernotifyGetwatchdetailsResponse(api.ResellernotifyGetwatchdetailsResponse o) {
+checkResellernotifyGetwatchdetailsResponse(
+    api.ResellernotifyGetwatchdetailsResponse o) {
   buildCounterResellernotifyGetwatchdetailsResponse++;
   if (buildCounterResellernotifyGetwatchdetailsResponse < 3) {
-    checkUnnamed2450(o.serviceAccountEmailAddresses);
+    checkUnnamed2437(o.serviceAccountEmailAddresses);
     unittest.expect(o.topicName, unittest.equals('foo'));
   }
   buildCounterResellernotifyGetwatchdetailsResponse--;
@@ -259,7 +259,8 @@
   return o;
 }
 
-checkSubscriptionPlanCommitmentInterval(api.SubscriptionPlanCommitmentInterval o) {
+checkSubscriptionPlanCommitmentInterval(
+    api.SubscriptionPlanCommitmentInterval o) {
   buildCounterSubscriptionPlanCommitmentInterval++;
   if (buildCounterSubscriptionPlanCommitmentInterval < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
@@ -291,14 +292,14 @@
   buildCounterSubscriptionPlan--;
 }
 
-buildUnnamed2451() {
+buildUnnamed2438() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2451(core.List<core.String> o) {
+checkUnnamed2438(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -366,7 +367,7 @@
     o.skuName = "foo";
     o.status = "foo";
     o.subscriptionId = "foo";
-    o.suspensionReasons = buildUnnamed2451();
+    o.suspensionReasons = buildUnnamed2438();
     o.transferInfo = buildSubscriptionTransferInfo();
     o.trialSettings = buildSubscriptionTrialSettings();
   }
@@ -392,21 +393,21 @@
     unittest.expect(o.skuName, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subscriptionId, unittest.equals('foo'));
-    checkUnnamed2451(o.suspensionReasons);
+    checkUnnamed2438(o.suspensionReasons);
     checkSubscriptionTransferInfo(o.transferInfo);
     checkSubscriptionTrialSettings(o.trialSettings);
   }
   buildCounterSubscription--;
 }
 
-buildUnnamed2452() {
+buildUnnamed2439() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed2452(core.List<api.Subscription> o) {
+checkUnnamed2439(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -419,7 +420,7 @@
   if (buildCounterSubscriptions < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed2452();
+    o.subscriptions = buildUnnamed2439();
   }
   buildCounterSubscriptions--;
   return o;
@@ -430,12 +431,11 @@
   if (buildCounterSubscriptions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2452(o.subscriptions);
+    checkUnnamed2439(o.subscriptions);
   }
   buildCounterSubscriptions--;
 }
 
-
 main() {
   unittest.group("obj-schema-Address", () {
     unittest.test("to-json--from-json", () {
@@ -445,7 +445,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChangePlanRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildChangePlanRequest();
@@ -454,7 +453,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Customer", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomer();
@@ -463,7 +461,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RenewalSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildRenewalSettings();
@@ -472,16 +469,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ResellernotifyGetwatchdetailsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildResellernotifyGetwatchdetailsResponse();
-      var od = new api.ResellernotifyGetwatchdetailsResponse.fromJson(o.toJson());
+      var od =
+          new api.ResellernotifyGetwatchdetailsResponse.fromJson(o.toJson());
       checkResellernotifyGetwatchdetailsResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-ResellernotifyResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildResellernotifyResource();
@@ -490,7 +486,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Seats", () {
     unittest.test("to-json--from-json", () {
       var o = buildSeats();
@@ -499,7 +494,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionPlanCommitmentInterval", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionPlanCommitmentInterval();
@@ -508,7 +502,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionPlan", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionPlan();
@@ -517,7 +510,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionTransferInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionTransferInfo();
@@ -526,7 +518,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionTrialSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionTrialSettings();
@@ -535,7 +526,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Subscription", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscription();
@@ -544,7 +534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Subscriptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptions();
@@ -553,10 +542,8 @@
     });
   });
 
-
   unittest.group("resource-CustomersResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.ResellerApi(mock).customers;
       var arg_customerId = "foo";
@@ -565,11 +552,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -585,27 +575,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerId).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .get(arg_customerId)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.ResellerApi(mock).customers;
       var arg_request = buildCustomer();
@@ -618,11 +610,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customers"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("customers"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -635,28 +630,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerAuthToken"].first, unittest.equals(arg_customerAuthToken));
-
+        unittest.expect(queryMap["customerAuthToken"].first,
+            unittest.equals(arg_customerAuthToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, customerAuthToken: arg_customerAuthToken).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .insert(arg_request, customerAuthToken: arg_customerAuthToken)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.ResellerApi(mock).customers;
       var arg_request = buildCustomer();
@@ -669,11 +667,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -689,27 +690,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_customerId).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .patch(arg_request, arg_customerId)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.CustomersResourceApi res = new api.ResellerApi(mock).customers;
       var arg_request = buildCustomer();
@@ -722,11 +725,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -742,43 +748,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCustomer());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_customerId).then(unittest.expectAsync1(((api.Customer response) {
+      res
+          .update(arg_request, arg_customerId)
+          .then(unittest.expectAsync1(((api.Customer response) {
         checkCustomer(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ResellernotifyResourceApi", () {
     unittest.test("method--getwatchdetails", () {
-
       var mock = new HttpServerMock();
-      api.ResellernotifyResourceApi res = new api.ResellerApi(mock).resellernotify;
+      api.ResellernotifyResourceApi res =
+          new api.ResellerApi(mock).resellernotify;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("resellernotify/getwatchdetails"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("resellernotify/getwatchdetails"));
         pathOffset += 30;
 
         var query = (req.url).query;
@@ -791,40 +801,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildResellernotifyGetwatchdetailsResponse());
+        var resp =
+            convert.JSON.encode(buildResellernotifyGetwatchdetailsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getwatchdetails().then(unittest.expectAsync1(((api.ResellernotifyGetwatchdetailsResponse response) {
+      res.getwatchdetails().then(unittest
+          .expectAsync1(((api.ResellernotifyGetwatchdetailsResponse response) {
         checkResellernotifyGetwatchdetailsResponse(response);
       })));
     });
 
     unittest.test("method--register", () {
-
       var mock = new HttpServerMock();
-      api.ResellernotifyResourceApi res = new api.ResellerApi(mock).resellernotify;
+      api.ResellernotifyResourceApi res =
+          new api.ResellerApi(mock).resellernotify;
       var arg_serviceAccountEmailAddress = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("resellernotify/register"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("resellernotify/register"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -837,41 +853,48 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["serviceAccountEmailAddress"].first, unittest.equals(arg_serviceAccountEmailAddress));
-
+        unittest.expect(queryMap["serviceAccountEmailAddress"].first,
+            unittest.equals(arg_serviceAccountEmailAddress));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResellernotifyResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.register(serviceAccountEmailAddress: arg_serviceAccountEmailAddress).then(unittest.expectAsync1(((api.ResellernotifyResource response) {
+      res
+          .register(serviceAccountEmailAddress: arg_serviceAccountEmailAddress)
+          .then(unittest.expectAsync1(((api.ResellernotifyResource response) {
         checkResellernotifyResource(response);
       })));
     });
 
     unittest.test("method--unregister", () {
-
       var mock = new HttpServerMock();
-      api.ResellernotifyResourceApi res = new api.ResellerApi(mock).resellernotify;
+      api.ResellernotifyResourceApi res =
+          new api.ResellerApi(mock).resellernotify;
       var arg_serviceAccountEmailAddress = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("resellernotify/unregister"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("resellernotify/unregister"));
         pathOffset += 25;
 
         var query = (req.url).query;
@@ -884,34 +907,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["serviceAccountEmailAddress"].first, unittest.equals(arg_serviceAccountEmailAddress));
-
+        unittest.expect(queryMap["serviceAccountEmailAddress"].first,
+            unittest.equals(arg_serviceAccountEmailAddress));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResellernotifyResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unregister(serviceAccountEmailAddress: arg_serviceAccountEmailAddress).then(unittest.expectAsync1(((api.ResellernotifyResource response) {
+      res
+          .unregister(
+              serviceAccountEmailAddress: arg_serviceAccountEmailAddress)
+          .then(unittest.expectAsync1(((api.ResellernotifyResource response) {
         checkResellernotifyResource(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SubscriptionsResourceApi", () {
     unittest.test("method--activate", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -919,25 +945,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         index = path.indexOf("/activate", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/activate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/activate"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -950,29 +983,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.activate(arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .activate(arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--changePlan", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_request = buildChangePlanRequest();
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
@@ -984,25 +1020,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         index = path.indexOf("/changePlan", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/changePlan"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("/changePlan"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -1015,29 +1058,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.changePlan(arg_request, arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .changePlan(arg_request, arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--changeRenewalSettings", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_request = buildRenewalSettings();
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
@@ -1049,25 +1095,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         index = path.indexOf("/changeRenewalSettings", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/changeRenewalSettings"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/changeRenewalSettings"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -1080,29 +1133,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.changeRenewalSettings(arg_request, arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .changeRenewalSettings(
+              arg_request, arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--changeSeats", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_request = buildSeats();
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
@@ -1114,25 +1171,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         index = path.indexOf("/changeSeats", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/changeSeats"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("/changeSeats"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -1145,29 +1209,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.changeSeats(arg_request, arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .changeSeats(arg_request, arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
       var arg_deletionType = "foo";
@@ -1176,18 +1243,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1203,28 +1275,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["deletionType"].first, unittest.equals(arg_deletionType));
-
+        unittest.expect(
+            queryMap["deletionType"].first, unittest.equals(arg_deletionType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_customerId, arg_subscriptionId, arg_deletionType).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_customerId, arg_subscriptionId, arg_deletionType)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1232,18 +1308,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1259,29 +1340,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .get(arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_request = buildSubscription();
       var arg_customerId = "foo";
       var arg_customerAuthToken = "foo";
@@ -1293,18 +1377,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("/subscriptions"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -1317,30 +1406,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerAuthToken"].first, unittest.equals(arg_customerAuthToken));
-
+        unittest.expect(queryMap["customerAuthToken"].first,
+            unittest.equals(arg_customerAuthToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_customerId, customerAuthToken: arg_customerAuthToken).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .insert(arg_request, arg_customerId,
+              customerAuthToken: arg_customerAuthToken)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_customerAuthToken = "foo";
       var arg_customerId = "foo";
       var arg_customerNamePrefix = "foo";
@@ -1351,11 +1445,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("subscriptions"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1368,34 +1465,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["customerAuthToken"].first, unittest.equals(arg_customerAuthToken));
-        unittest.expect(queryMap["customerId"].first, unittest.equals(arg_customerId));
-        unittest.expect(queryMap["customerNamePrefix"].first, unittest.equals(arg_customerNamePrefix));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["customerAuthToken"].first,
+            unittest.equals(arg_customerAuthToken));
+        unittest.expect(
+            queryMap["customerId"].first, unittest.equals(arg_customerId));
+        unittest.expect(queryMap["customerNamePrefix"].first,
+            unittest.equals(arg_customerNamePrefix));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscriptions());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(customerAuthToken: arg_customerAuthToken, customerId: arg_customerId, customerNamePrefix: arg_customerNamePrefix, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.Subscriptions response) {
+      res
+          .list(
+              customerAuthToken: arg_customerAuthToken,
+              customerId: arg_customerId,
+              customerNamePrefix: arg_customerNamePrefix,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.Subscriptions response) {
         checkSubscriptions(response);
       })));
     });
 
     unittest.test("method--startPaidService", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1403,25 +1513,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         index = path.indexOf("/startPaidService", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/startPaidService"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("/startPaidService"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -1434,29 +1551,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.startPaidService(arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .startPaidService(arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--suspend", () {
-
       var mock = new HttpServerMock();
-      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      api.SubscriptionsResourceApi res =
+          new api.ResellerApi(mock).subscriptions;
       var arg_customerId = "foo";
       var arg_subscriptionId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1464,25 +1584,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("apps/reseller/v1/"));
         pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_customerId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/subscriptions/"));
         pathOffset += 15;
         index = path.indexOf("/suspend", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/suspend"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/suspend"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1495,27 +1622,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.suspend(arg_customerId, arg_subscriptionId).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .suspend(arg_customerId, arg_subscriptionId)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/runtimeconfig/v1_test.dart b/generated/googleapis/test/runtimeconfig/v1_test.dart
index fd0d25b..8f44dab 100644
--- a/generated/googleapis/test/runtimeconfig/v1_test.dart
+++ b/generated/googleapis/test/runtimeconfig/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.runtimeconfig.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/runtimeconfig/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -55,16 +54,14 @@
 buildCancelOperationRequest() {
   var o = new api.CancelOperationRequest();
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
   return o;
 }
 
 checkCancelOperationRequest(api.CancelOperationRequest o) {
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
 }
 
@@ -72,27 +69,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed1946() {
+buildUnnamed1944() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1946(core.List<api.Operation> o) {
+checkUnnamed1944(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -104,7 +99,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1946();
+    o.operations = buildUnnamed1944();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -114,35 +109,67 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1946(o.operations);
+    checkUnnamed1944(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1947() {
+buildUnnamed1945() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1947(core.Map<core.String, core.Object> o) {
+checkUnnamed1945(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1948() {
+buildUnnamed1946() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1948(core.Map<core.String, core.Object> o) {
+checkUnnamed1946(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -152,9 +179,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1947();
+    o.metadata = buildUnnamed1945();
     o.name = "foo";
-    o.response = buildUnnamed1948();
+    o.response = buildUnnamed1946();
   }
   buildCounterOperation--;
   return o;
@@ -165,37 +192,53 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1947(o.metadata);
+    checkUnnamed1945(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1948(o.response);
+    checkUnnamed1946(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1949() {
+buildUnnamed1947() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1949(core.Map<core.String, core.Object> o) {
+checkUnnamed1947(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1950() {
+buildUnnamed1948() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1949());
-  o.add(buildUnnamed1949());
+  o.add(buildUnnamed1947());
+  o.add(buildUnnamed1947());
   return o;
 }
 
-checkUnnamed1950(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1948(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1949(o[0]);
-  checkUnnamed1949(o[1]);
+  checkUnnamed1947(o[0]);
+  checkUnnamed1947(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -204,7 +247,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1950();
+    o.details = buildUnnamed1948();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -215,13 +258,12 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1950(o.details);
+    checkUnnamed1948(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-
 main() {
   unittest.group("obj-schema-CancelOperationRequest", () {
     unittest.test("to-json--from-json", () {
@@ -231,7 +273,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -240,7 +281,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -249,7 +289,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -258,7 +297,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -267,10 +305,8 @@
     });
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.RuntimeconfigApi(mock).operations;
       var arg_request = buildCancelOperationRequest();
@@ -283,9 +319,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -299,27 +337,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .cancel(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.RuntimeconfigApi(mock).operations;
       var arg_name = "foo";
@@ -328,9 +368,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -344,16 +386,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -364,21 +407,22 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.RuntimeconfigApi(mock).operations;
       var arg_name = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -392,30 +436,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/safebrowsing/v4_test.dart b/generated/googleapis/test/safebrowsing/v4_test.dart
index ddd5b8b..e949b67 100644
--- a/generated/googleapis/test/safebrowsing/v4_test.dart
+++ b/generated/googleapis/test/safebrowsing/v4_test.dart
@@ -1,12 +1,10 @@
 library googleapis.safebrowsing.v4.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/safebrowsing/v4.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -91,112 +90,6 @@
   buildCounterClientInfo--;
 }
 
-buildUnnamed1081() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1081(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterConstraints = 0;
-buildConstraints() {
-  var o = new api.Constraints();
-  buildCounterConstraints++;
-  if (buildCounterConstraints < 3) {
-    o.maxDatabaseEntries = 42;
-    o.maxUpdateEntries = 42;
-    o.region = "foo";
-    o.supportedCompressions = buildUnnamed1081();
-  }
-  buildCounterConstraints--;
-  return o;
-}
-
-checkConstraints(api.Constraints o) {
-  buildCounterConstraints++;
-  if (buildCounterConstraints < 3) {
-    unittest.expect(o.maxDatabaseEntries, unittest.equals(42));
-    unittest.expect(o.maxUpdateEntries, unittest.equals(42));
-    unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1081(o.supportedCompressions);
-  }
-  buildCounterConstraints--;
-}
-
-buildUnnamed1082() {
-  var o = new core.List<api.ListUpdateRequest>();
-  o.add(buildListUpdateRequest());
-  o.add(buildListUpdateRequest());
-  return o;
-}
-
-checkUnnamed1082(core.List<api.ListUpdateRequest> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkListUpdateRequest(o[0]);
-  checkListUpdateRequest(o[1]);
-}
-
-core.int buildCounterFetchThreatListUpdatesRequest = 0;
-buildFetchThreatListUpdatesRequest() {
-  var o = new api.FetchThreatListUpdatesRequest();
-  buildCounterFetchThreatListUpdatesRequest++;
-  if (buildCounterFetchThreatListUpdatesRequest < 3) {
-    o.client = buildClientInfo();
-    o.listUpdateRequests = buildUnnamed1082();
-  }
-  buildCounterFetchThreatListUpdatesRequest--;
-  return o;
-}
-
-checkFetchThreatListUpdatesRequest(api.FetchThreatListUpdatesRequest o) {
-  buildCounterFetchThreatListUpdatesRequest++;
-  if (buildCounterFetchThreatListUpdatesRequest < 3) {
-    checkClientInfo(o.client);
-    checkUnnamed1082(o.listUpdateRequests);
-  }
-  buildCounterFetchThreatListUpdatesRequest--;
-}
-
-buildUnnamed1083() {
-  var o = new core.List<api.ListUpdateResponse>();
-  o.add(buildListUpdateResponse());
-  o.add(buildListUpdateResponse());
-  return o;
-}
-
-checkUnnamed1083(core.List<api.ListUpdateResponse> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkListUpdateResponse(o[0]);
-  checkListUpdateResponse(o[1]);
-}
-
-core.int buildCounterFetchThreatListUpdatesResponse = 0;
-buildFetchThreatListUpdatesResponse() {
-  var o = new api.FetchThreatListUpdatesResponse();
-  buildCounterFetchThreatListUpdatesResponse++;
-  if (buildCounterFetchThreatListUpdatesResponse < 3) {
-    o.listUpdateResponses = buildUnnamed1083();
-    o.minimumWaitDuration = "foo";
-  }
-  buildCounterFetchThreatListUpdatesResponse--;
-  return o;
-}
-
-checkFetchThreatListUpdatesResponse(api.FetchThreatListUpdatesResponse o) {
-  buildCounterFetchThreatListUpdatesResponse++;
-  if (buildCounterFetchThreatListUpdatesResponse < 3) {
-    checkUnnamed1083(o.listUpdateResponses);
-    unittest.expect(o.minimumWaitDuration, unittest.equals('foo'));
-  }
-  buildCounterFetchThreatListUpdatesResponse--;
-}
-
 buildUnnamed1084() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -210,6 +103,112 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterConstraints = 0;
+buildConstraints() {
+  var o = new api.Constraints();
+  buildCounterConstraints++;
+  if (buildCounterConstraints < 3) {
+    o.maxDatabaseEntries = 42;
+    o.maxUpdateEntries = 42;
+    o.region = "foo";
+    o.supportedCompressions = buildUnnamed1084();
+  }
+  buildCounterConstraints--;
+  return o;
+}
+
+checkConstraints(api.Constraints o) {
+  buildCounterConstraints++;
+  if (buildCounterConstraints < 3) {
+    unittest.expect(o.maxDatabaseEntries, unittest.equals(42));
+    unittest.expect(o.maxUpdateEntries, unittest.equals(42));
+    unittest.expect(o.region, unittest.equals('foo'));
+    checkUnnamed1084(o.supportedCompressions);
+  }
+  buildCounterConstraints--;
+}
+
+buildUnnamed1085() {
+  var o = new core.List<api.ListUpdateRequest>();
+  o.add(buildListUpdateRequest());
+  o.add(buildListUpdateRequest());
+  return o;
+}
+
+checkUnnamed1085(core.List<api.ListUpdateRequest> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkListUpdateRequest(o[0]);
+  checkListUpdateRequest(o[1]);
+}
+
+core.int buildCounterFetchThreatListUpdatesRequest = 0;
+buildFetchThreatListUpdatesRequest() {
+  var o = new api.FetchThreatListUpdatesRequest();
+  buildCounterFetchThreatListUpdatesRequest++;
+  if (buildCounterFetchThreatListUpdatesRequest < 3) {
+    o.client = buildClientInfo();
+    o.listUpdateRequests = buildUnnamed1085();
+  }
+  buildCounterFetchThreatListUpdatesRequest--;
+  return o;
+}
+
+checkFetchThreatListUpdatesRequest(api.FetchThreatListUpdatesRequest o) {
+  buildCounterFetchThreatListUpdatesRequest++;
+  if (buildCounterFetchThreatListUpdatesRequest < 3) {
+    checkClientInfo(o.client);
+    checkUnnamed1085(o.listUpdateRequests);
+  }
+  buildCounterFetchThreatListUpdatesRequest--;
+}
+
+buildUnnamed1086() {
+  var o = new core.List<api.ListUpdateResponse>();
+  o.add(buildListUpdateResponse());
+  o.add(buildListUpdateResponse());
+  return o;
+}
+
+checkUnnamed1086(core.List<api.ListUpdateResponse> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkListUpdateResponse(o[0]);
+  checkListUpdateResponse(o[1]);
+}
+
+core.int buildCounterFetchThreatListUpdatesResponse = 0;
+buildFetchThreatListUpdatesResponse() {
+  var o = new api.FetchThreatListUpdatesResponse();
+  buildCounterFetchThreatListUpdatesResponse++;
+  if (buildCounterFetchThreatListUpdatesResponse < 3) {
+    o.listUpdateResponses = buildUnnamed1086();
+    o.minimumWaitDuration = "foo";
+  }
+  buildCounterFetchThreatListUpdatesResponse--;
+  return o;
+}
+
+checkFetchThreatListUpdatesResponse(api.FetchThreatListUpdatesResponse o) {
+  buildCounterFetchThreatListUpdatesResponse++;
+  if (buildCounterFetchThreatListUpdatesResponse < 3) {
+    checkUnnamed1086(o.listUpdateResponses);
+    unittest.expect(o.minimumWaitDuration, unittest.equals('foo'));
+  }
+  buildCounterFetchThreatListUpdatesResponse--;
+}
+
+buildUnnamed1087() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1087(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 core.int buildCounterFindFullHashesRequest = 0;
 buildFindFullHashesRequest() {
   var o = new api.FindFullHashesRequest();
@@ -217,7 +216,7 @@
   if (buildCounterFindFullHashesRequest < 3) {
     o.apiClient = buildClientInfo();
     o.client = buildClientInfo();
-    o.clientStates = buildUnnamed1084();
+    o.clientStates = buildUnnamed1087();
     o.threatInfo = buildThreatInfo();
   }
   buildCounterFindFullHashesRequest--;
@@ -229,20 +228,20 @@
   if (buildCounterFindFullHashesRequest < 3) {
     checkClientInfo(o.apiClient);
     checkClientInfo(o.client);
-    checkUnnamed1084(o.clientStates);
+    checkUnnamed1087(o.clientStates);
     checkThreatInfo(o.threatInfo);
   }
   buildCounterFindFullHashesRequest--;
 }
 
-buildUnnamed1085() {
+buildUnnamed1088() {
   var o = new core.List<api.ThreatMatch>();
   o.add(buildThreatMatch());
   o.add(buildThreatMatch());
   return o;
 }
 
-checkUnnamed1085(core.List<api.ThreatMatch> o) {
+checkUnnamed1088(core.List<api.ThreatMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatMatch(o[0]);
   checkThreatMatch(o[1]);
@@ -253,7 +252,7 @@
   var o = new api.FindFullHashesResponse();
   buildCounterFindFullHashesResponse++;
   if (buildCounterFindFullHashesResponse < 3) {
-    o.matches = buildUnnamed1085();
+    o.matches = buildUnnamed1088();
     o.minimumWaitDuration = "foo";
     o.negativeCacheDuration = "foo";
   }
@@ -264,7 +263,7 @@
 checkFindFullHashesResponse(api.FindFullHashesResponse o) {
   buildCounterFindFullHashesResponse++;
   if (buildCounterFindFullHashesResponse < 3) {
-    checkUnnamed1085(o.matches);
+    checkUnnamed1088(o.matches);
     unittest.expect(o.minimumWaitDuration, unittest.equals('foo'));
     unittest.expect(o.negativeCacheDuration, unittest.equals('foo'));
   }
@@ -292,14 +291,14 @@
   buildCounterFindThreatMatchesRequest--;
 }
 
-buildUnnamed1086() {
+buildUnnamed1089() {
   var o = new core.List<api.ThreatMatch>();
   o.add(buildThreatMatch());
   o.add(buildThreatMatch());
   return o;
 }
 
-checkUnnamed1086(core.List<api.ThreatMatch> o) {
+checkUnnamed1089(core.List<api.ThreatMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatMatch(o[0]);
   checkThreatMatch(o[1]);
@@ -310,7 +309,7 @@
   var o = new api.FindThreatMatchesResponse();
   buildCounterFindThreatMatchesResponse++;
   if (buildCounterFindThreatMatchesResponse < 3) {
-    o.matches = buildUnnamed1086();
+    o.matches = buildUnnamed1089();
   }
   buildCounterFindThreatMatchesResponse--;
   return o;
@@ -319,19 +318,19 @@
 checkFindThreatMatchesResponse(api.FindThreatMatchesResponse o) {
   buildCounterFindThreatMatchesResponse++;
   if (buildCounterFindThreatMatchesResponse < 3) {
-    checkUnnamed1086(o.matches);
+    checkUnnamed1089(o.matches);
   }
   buildCounterFindThreatMatchesResponse--;
 }
 
-buildUnnamed1087() {
+buildUnnamed1090() {
   var o = new core.List<api.ThreatListDescriptor>();
   o.add(buildThreatListDescriptor());
   o.add(buildThreatListDescriptor());
   return o;
 }
 
-checkUnnamed1087(core.List<api.ThreatListDescriptor> o) {
+checkUnnamed1090(core.List<api.ThreatListDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatListDescriptor(o[0]);
   checkThreatListDescriptor(o[1]);
@@ -342,7 +341,7 @@
   var o = new api.ListThreatListsResponse();
   buildCounterListThreatListsResponse++;
   if (buildCounterListThreatListsResponse < 3) {
-    o.threatLists = buildUnnamed1087();
+    o.threatLists = buildUnnamed1090();
   }
   buildCounterListThreatListsResponse--;
   return o;
@@ -351,7 +350,7 @@
 checkListThreatListsResponse(api.ListThreatListsResponse o) {
   buildCounterListThreatListsResponse++;
   if (buildCounterListThreatListsResponse < 3) {
-    checkUnnamed1087(o.threatLists);
+    checkUnnamed1090(o.threatLists);
   }
   buildCounterListThreatListsResponse--;
 }
@@ -383,27 +382,27 @@
   buildCounterListUpdateRequest--;
 }
 
-buildUnnamed1088() {
+buildUnnamed1091() {
   var o = new core.List<api.ThreatEntrySet>();
   o.add(buildThreatEntrySet());
   o.add(buildThreatEntrySet());
   return o;
 }
 
-checkUnnamed1088(core.List<api.ThreatEntrySet> o) {
+checkUnnamed1091(core.List<api.ThreatEntrySet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatEntrySet(o[0]);
   checkThreatEntrySet(o[1]);
 }
 
-buildUnnamed1089() {
+buildUnnamed1092() {
   var o = new core.List<api.ThreatEntrySet>();
   o.add(buildThreatEntrySet());
   o.add(buildThreatEntrySet());
   return o;
 }
 
-checkUnnamed1089(core.List<api.ThreatEntrySet> o) {
+checkUnnamed1092(core.List<api.ThreatEntrySet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThreatEntrySet(o[0]);
   checkThreatEntrySet(o[1]);
@@ -414,11 +413,11 @@
   var o = new api.ListUpdateResponse();
   buildCounterListUpdateResponse++;
   if (buildCounterListUpdateResponse < 3) {
-    o.additions = buildUnnamed1088();
+    o.additions = buildUnnamed1091();
     o.checksum = buildChecksum();
     o.newClientState = "foo";
     o.platformType = "foo";
-    o.removals = buildUnnamed1089();
+    o.removals = buildUnnamed1092();
     o.responseType = "foo";
     o.threatEntryType = "foo";
     o.threatType = "foo";
@@ -430,11 +429,11 @@
 checkListUpdateResponse(api.ListUpdateResponse o) {
   buildCounterListUpdateResponse++;
   if (buildCounterListUpdateResponse < 3) {
-    checkUnnamed1088(o.additions);
+    checkUnnamed1091(o.additions);
     checkChecksum(o.checksum);
     unittest.expect(o.newClientState, unittest.equals('foo'));
     unittest.expect(o.platformType, unittest.equals('foo'));
-    checkUnnamed1089(o.removals);
+    checkUnnamed1092(o.removals);
     unittest.expect(o.responseType, unittest.equals('foo'));
     unittest.expect(o.threatEntryType, unittest.equals('foo'));
     unittest.expect(o.threatType, unittest.equals('foo'));
@@ -484,14 +483,14 @@
   buildCounterRawHashes--;
 }
 
-buildUnnamed1090() {
+buildUnnamed1093() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1090(core.List<core.int> o) {
+checkUnnamed1093(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -502,7 +501,7 @@
   var o = new api.RawIndices();
   buildCounterRawIndices++;
   if (buildCounterRawIndices < 3) {
-    o.indices = buildUnnamed1090();
+    o.indices = buildUnnamed1093();
   }
   buildCounterRawIndices--;
   return o;
@@ -511,7 +510,7 @@
 checkRawIndices(api.RawIndices o) {
   buildCounterRawIndices++;
   if (buildCounterRawIndices < 3) {
-    checkUnnamed1090(o.indices);
+    checkUnnamed1093(o.indices);
   }
   buildCounterRawIndices--;
 }
@@ -564,14 +563,14 @@
   buildCounterThreatEntry--;
 }
 
-buildUnnamed1091() {
+buildUnnamed1094() {
   var o = new core.List<api.MetadataEntry>();
   o.add(buildMetadataEntry());
   o.add(buildMetadataEntry());
   return o;
 }
 
-checkUnnamed1091(core.List<api.MetadataEntry> o) {
+checkUnnamed1094(core.List<api.MetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataEntry(o[0]);
   checkMetadataEntry(o[1]);
@@ -582,7 +581,7 @@
   var o = new api.ThreatEntryMetadata();
   buildCounterThreatEntryMetadata++;
   if (buildCounterThreatEntryMetadata < 3) {
-    o.entries = buildUnnamed1091();
+    o.entries = buildUnnamed1094();
   }
   buildCounterThreatEntryMetadata--;
   return o;
@@ -591,7 +590,7 @@
 checkThreatEntryMetadata(api.ThreatEntryMetadata o) {
   buildCounterThreatEntryMetadata++;
   if (buildCounterThreatEntryMetadata < 3) {
-    checkUnnamed1091(o.entries);
+    checkUnnamed1094(o.entries);
   }
   buildCounterThreatEntryMetadata--;
 }
@@ -623,45 +622,6 @@
   buildCounterThreatEntrySet--;
 }
 
-buildUnnamed1092() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1092(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1093() {
-  var o = new core.List<api.ThreatEntry>();
-  o.add(buildThreatEntry());
-  o.add(buildThreatEntry());
-  return o;
-}
-
-checkUnnamed1093(core.List<api.ThreatEntry> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkThreatEntry(o[0]);
-  checkThreatEntry(o[1]);
-}
-
-buildUnnamed1094() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1094(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed1095() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -675,15 +635,54 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1096() {
+  var o = new core.List<api.ThreatEntry>();
+  o.add(buildThreatEntry());
+  o.add(buildThreatEntry());
+  return o;
+}
+
+checkUnnamed1096(core.List<api.ThreatEntry> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkThreatEntry(o[0]);
+  checkThreatEntry(o[1]);
+}
+
+buildUnnamed1097() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1097(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1098() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1098(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 core.int buildCounterThreatInfo = 0;
 buildThreatInfo() {
   var o = new api.ThreatInfo();
   buildCounterThreatInfo++;
   if (buildCounterThreatInfo < 3) {
-    o.platformTypes = buildUnnamed1092();
-    o.threatEntries = buildUnnamed1093();
-    o.threatEntryTypes = buildUnnamed1094();
-    o.threatTypes = buildUnnamed1095();
+    o.platformTypes = buildUnnamed1095();
+    o.threatEntries = buildUnnamed1096();
+    o.threatEntryTypes = buildUnnamed1097();
+    o.threatTypes = buildUnnamed1098();
   }
   buildCounterThreatInfo--;
   return o;
@@ -692,10 +691,10 @@
 checkThreatInfo(api.ThreatInfo o) {
   buildCounterThreatInfo++;
   if (buildCounterThreatInfo < 3) {
-    checkUnnamed1092(o.platformTypes);
-    checkUnnamed1093(o.threatEntries);
-    checkUnnamed1094(o.threatEntryTypes);
-    checkUnnamed1095(o.threatTypes);
+    checkUnnamed1095(o.platformTypes);
+    checkUnnamed1096(o.threatEntries);
+    checkUnnamed1097(o.threatEntryTypes);
+    checkUnnamed1098(o.threatTypes);
   }
   buildCounterThreatInfo--;
 }
@@ -752,7 +751,6 @@
   buildCounterThreatMatch--;
 }
 
-
 main() {
   unittest.group("obj-schema-Checksum", () {
     unittest.test("to-json--from-json", () {
@@ -762,7 +760,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ClientInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildClientInfo();
@@ -771,7 +768,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Constraints", () {
     unittest.test("to-json--from-json", () {
       var o = buildConstraints();
@@ -780,7 +776,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FetchThreatListUpdatesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildFetchThreatListUpdatesRequest();
@@ -789,7 +784,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FetchThreatListUpdatesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildFetchThreatListUpdatesResponse();
@@ -798,7 +792,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FindFullHashesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindFullHashesRequest();
@@ -807,7 +800,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FindFullHashesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindFullHashesResponse();
@@ -816,7 +808,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FindThreatMatchesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindThreatMatchesRequest();
@@ -825,7 +816,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FindThreatMatchesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildFindThreatMatchesResponse();
@@ -834,7 +824,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListThreatListsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListThreatListsResponse();
@@ -843,7 +832,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListUpdateRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildListUpdateRequest();
@@ -852,7 +840,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListUpdateResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListUpdateResponse();
@@ -861,7 +848,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetadataEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetadataEntry();
@@ -870,7 +856,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RawHashes", () {
     unittest.test("to-json--from-json", () {
       var o = buildRawHashes();
@@ -879,7 +864,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RawIndices", () {
     unittest.test("to-json--from-json", () {
       var o = buildRawIndices();
@@ -888,7 +872,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RiceDeltaEncoding", () {
     unittest.test("to-json--from-json", () {
       var o = buildRiceDeltaEncoding();
@@ -897,7 +880,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThreatEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatEntry();
@@ -906,7 +888,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThreatEntryMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatEntryMetadata();
@@ -915,7 +896,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThreatEntrySet", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatEntrySet();
@@ -924,7 +904,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThreatInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatInfo();
@@ -933,7 +912,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThreatListDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatListDescriptor();
@@ -942,7 +920,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThreatMatch", () {
     unittest.test("to-json--from-json", () {
       var o = buildThreatMatch();
@@ -951,23 +928,24 @@
     });
   });
 
-
   unittest.group("resource-EncodedFullHashesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EncodedFullHashesResourceApi res = new api.SafebrowsingApi(mock).encodedFullHashes;
+      api.EncodedFullHashesResourceApi res =
+          new api.SafebrowsingApi(mock).encodedFullHashes;
       var arg_encodedRequest = "foo";
-      var arg_clientId = "foo";
       var arg_clientVersion = "foo";
+      var arg_clientId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("v4/encodedFullHashes/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("v4/encodedFullHashes/"));
         pathOffset += 21;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -983,35 +961,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientId"].first, unittest.equals(arg_clientId));
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
+        unittest.expect(
+            queryMap["clientId"].first, unittest.equals(arg_clientId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFindFullHashesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_encodedRequest, clientId: arg_clientId, clientVersion: arg_clientVersion).then(unittest.expectAsync1(((api.FindFullHashesResponse response) {
+      res
+          .get(arg_encodedRequest,
+              clientVersion: arg_clientVersion, clientId: arg_clientId)
+          .then(unittest.expectAsync1(((api.FindFullHashesResponse response) {
         checkFindFullHashesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-EncodedUpdatesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.EncodedUpdatesResourceApi res = new api.SafebrowsingApi(mock).encodedUpdates;
+      api.EncodedUpdatesResourceApi res =
+          new api.SafebrowsingApi(mock).encodedUpdates;
       var arg_encodedRequest = "foo";
       var arg_clientId = "foo";
       var arg_clientVersion = "foo";
@@ -1020,9 +1002,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v4/encodedUpdates/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v4/encodedUpdates/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1038,33 +1022,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["clientId"].first, unittest.equals(arg_clientId));
-        unittest.expect(queryMap["clientVersion"].first, unittest.equals(arg_clientVersion));
-
+        unittest.expect(
+            queryMap["clientId"].first, unittest.equals(arg_clientId));
+        unittest.expect(queryMap["clientVersion"].first,
+            unittest.equals(arg_clientVersion));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFetchThreatListUpdatesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_encodedRequest, clientId: arg_clientId, clientVersion: arg_clientVersion).then(unittest.expectAsync1(((api.FetchThreatListUpdatesResponse response) {
+      res
+          .get(arg_encodedRequest,
+              clientId: arg_clientId, clientVersion: arg_clientVersion)
+          .then(unittest
+              .expectAsync1(((api.FetchThreatListUpdatesResponse response) {
         checkFetchThreatListUpdatesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-FullHashesResourceApi", () {
     unittest.test("method--find", () {
-
       var mock = new HttpServerMock();
       api.FullHashesResourceApi res = new api.SafebrowsingApi(mock).fullHashes;
       var arg_request = buildFindFullHashesRequest();
@@ -1076,9 +1064,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v4/fullHashes:find"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v4/fullHashes:find"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -1091,33 +1081,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFindFullHashesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.find(arg_request).then(unittest.expectAsync1(((api.FindFullHashesResponse response) {
+      res
+          .find(arg_request)
+          .then(unittest.expectAsync1(((api.FindFullHashesResponse response) {
         checkFindFullHashesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ThreatListUpdatesResourceApi", () {
     unittest.test("method--fetch", () {
-
       var mock = new HttpServerMock();
-      api.ThreatListUpdatesResourceApi res = new api.SafebrowsingApi(mock).threatListUpdates;
+      api.ThreatListUpdatesResourceApi res =
+          new api.SafebrowsingApi(mock).threatListUpdates;
       var arg_request = buildFetchThreatListUpdatesRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.FetchThreatListUpdatesRequest.fromJson(json);
@@ -1127,9 +1118,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("v4/threatListUpdates:fetch"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 26),
+            unittest.equals("v4/threatListUpdates:fetch"));
         pathOffset += 26;
 
         var query = (req.url).query;
@@ -1142,41 +1135,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFetchThreatListUpdatesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.fetch(arg_request).then(unittest.expectAsync1(((api.FetchThreatListUpdatesResponse response) {
+      res.fetch(arg_request).then(
+          unittest.expectAsync1(((api.FetchThreatListUpdatesResponse response) {
         checkFetchThreatListUpdatesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ThreatListsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ThreatListsResourceApi res = new api.SafebrowsingApi(mock).threatLists;
+      api.ThreatListsResourceApi res =
+          new api.SafebrowsingApi(mock).threatLists;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v4/threatLists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v4/threatLists"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -1189,33 +1184,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListThreatListsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list().then(unittest.expectAsync1(((api.ListThreatListsResponse response) {
+      res
+          .list()
+          .then(unittest.expectAsync1(((api.ListThreatListsResponse response) {
         checkListThreatListsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ThreatMatchesResourceApi", () {
     unittest.test("method--find", () {
-
       var mock = new HttpServerMock();
-      api.ThreatMatchesResourceApi res = new api.SafebrowsingApi(mock).threatMatches;
+      api.ThreatMatchesResourceApi res =
+          new api.SafebrowsingApi(mock).threatMatches;
       var arg_request = buildFindThreatMatchesRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.FindThreatMatchesRequest.fromJson(json);
@@ -1225,9 +1221,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("v4/threatMatches:find"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("v4/threatMatches:find"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -1240,27 +1238,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFindThreatMatchesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.find(arg_request).then(unittest.expectAsync1(((api.FindThreatMatchesResponse response) {
+      res.find(arg_request).then(
+          unittest.expectAsync1(((api.FindThreatMatchesResponse response) {
         checkFindThreatMatchesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/script/v1_test.dart b/generated/googleapis/test/script/v1_test.dart
index 31aa646..bf89db9 100644
--- a/generated/googleapis/test/script/v1_test.dart
+++ b/generated/googleapis/test/script/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.script.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/script/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed799() {
+buildUnnamed802() {
   var o = new core.List<api.ScriptStackTraceElement>();
   o.add(buildScriptStackTraceElement());
   o.add(buildScriptStackTraceElement());
   return o;
 }
 
-checkUnnamed799(core.List<api.ScriptStackTraceElement> o) {
+checkUnnamed802(core.List<api.ScriptStackTraceElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScriptStackTraceElement(o[0]);
   checkScriptStackTraceElement(o[1]);
@@ -71,7 +70,7 @@
   if (buildCounterExecutionError < 3) {
     o.errorMessage = "foo";
     o.errorType = "foo";
-    o.scriptStackTraceElements = buildUnnamed799();
+    o.scriptStackTraceElements = buildUnnamed802();
   }
   buildCounterExecutionError--;
   return o;
@@ -82,22 +81,38 @@
   if (buildCounterExecutionError < 3) {
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.errorType, unittest.equals('foo'));
-    checkUnnamed799(o.scriptStackTraceElements);
+    checkUnnamed802(o.scriptStackTraceElements);
   }
   buildCounterExecutionError--;
 }
 
-buildUnnamed800() {
+buildUnnamed803() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed800(core.List<core.Object> o) {
+checkUnnamed803(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterExecutionRequest = 0;
@@ -107,7 +122,7 @@
   if (buildCounterExecutionRequest < 3) {
     o.devMode = true;
     o.function = "foo";
-    o.parameters = buildUnnamed800();
+    o.parameters = buildUnnamed803();
     o.sessionState = "foo";
   }
   buildCounterExecutionRequest--;
@@ -119,7 +134,7 @@
   if (buildCounterExecutionRequest < 3) {
     unittest.expect(o.devMode, unittest.isTrue);
     unittest.expect(o.function, unittest.equals('foo'));
-    checkUnnamed800(o.parameters);
+    checkUnnamed803(o.parameters);
     unittest.expect(o.sessionState, unittest.equals('foo'));
   }
   buildCounterExecutionRequest--;
@@ -130,7 +145,11 @@
   var o = new api.ExecutionResponse();
   buildCounterExecutionResponse++;
   if (buildCounterExecutionResponse < 3) {
-    o.result = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.result = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
   }
   buildCounterExecutionResponse--;
   return o;
@@ -139,35 +158,71 @@
 checkExecutionResponse(api.ExecutionResponse o) {
   buildCounterExecutionResponse++;
   if (buildCounterExecutionResponse < 3) {
-    var casted3 = (o.result) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
+    var casted3 = (o.result) as core.Map;
+    unittest.expect(casted3, unittest.hasLength(3));
+    unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted3["bool"], unittest.equals(true));
+    unittest.expect(casted3["string"], unittest.equals('foo'));
   }
   buildCounterExecutionResponse--;
 }
 
-buildUnnamed801() {
+buildUnnamed804() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed801(core.Map<core.String, core.Object> o) {
+checkUnnamed804(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted4 = (o["x"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
-  var casted5 = (o["y"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
+  var casted4 = (o["x"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
+  var casted5 = (o["y"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
 }
 
-buildUnnamed802() {
+buildUnnamed805() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed802(core.Map<core.String, core.Object> o) {
+checkUnnamed805(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted6 = (o["x"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
-  var casted7 = (o["y"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
+  var casted6 = (o["x"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
+  var casted7 = (o["y"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -177,9 +232,8 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed801();
-    o.name = "foo";
-    o.response = buildUnnamed802();
+    o.metadata = buildUnnamed804();
+    o.response = buildUnnamed805();
   }
   buildCounterOperation--;
   return o;
@@ -190,9 +244,8 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed801(o.metadata);
-    unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed802(o.response);
+    checkUnnamed804(o.metadata);
+    checkUnnamed805(o.response);
   }
   buildCounterOperation--;
 }
@@ -218,30 +271,46 @@
   buildCounterScriptStackTraceElement--;
 }
 
-buildUnnamed803() {
+buildUnnamed806() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed803(core.Map<core.String, core.Object> o) {
+checkUnnamed806(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted8 = (o["x"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
-  var casted9 = (o["y"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
+  var casted8 = (o["x"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
+  var casted9 = (o["y"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
 }
 
-buildUnnamed804() {
+buildUnnamed807() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed803());
-  o.add(buildUnnamed803());
+  o.add(buildUnnamed806());
+  o.add(buildUnnamed806());
   return o;
 }
 
-checkUnnamed804(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed807(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed803(o[0]);
-  checkUnnamed803(o[1]);
+  checkUnnamed806(o[0]);
+  checkUnnamed806(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -250,7 +319,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed804();
+    o.details = buildUnnamed807();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -261,13 +330,12 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed804(o.details);
+    checkUnnamed807(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-
 main() {
   unittest.group("obj-schema-ExecutionError", () {
     unittest.test("to-json--from-json", () {
@@ -277,7 +345,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExecutionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildExecutionRequest();
@@ -286,7 +353,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExecutionResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildExecutionResponse();
@@ -295,7 +361,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -304,7 +369,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ScriptStackTraceElement", () {
     unittest.test("to-json--from-json", () {
       var o = buildScriptStackTraceElement();
@@ -313,7 +377,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -322,10 +385,8 @@
     });
   });
 
-
   unittest.group("resource-ScriptsResourceApi", () {
     unittest.test("method--run", () {
-
       var mock = new HttpServerMock();
       api.ScriptsResourceApi res = new api.ScriptApi(mock).scripts;
       var arg_request = buildExecutionRequest();
@@ -338,16 +399,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/scripts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/scripts/"));
         pathOffset += 11;
         index = path.indexOf(":run", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_scriptId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals(":run"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 4),
+            unittest.equals(":run"));
         pathOffset += 4;
 
         var query = (req.url).query;
@@ -360,27 +425,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.run(arg_request, arg_scriptId).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .run(arg_request, arg_scriptId)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/searchconsole/v1_test.dart b/generated/googleapis/test/searchconsole/v1_test.dart
index e11da37..3e36c2e 100644
--- a/generated/googleapis/test/searchconsole/v1_test.dart
+++ b/generated/googleapis/test/searchconsole/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.searchconsole.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/searchconsole/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -150,27 +149,27 @@
   buildCounterRunMobileFriendlyTestRequest--;
 }
 
-buildUnnamed1233() {
+buildUnnamed1229() {
   var o = new core.List<api.MobileFriendlyIssue>();
   o.add(buildMobileFriendlyIssue());
   o.add(buildMobileFriendlyIssue());
   return o;
 }
 
-checkUnnamed1233(core.List<api.MobileFriendlyIssue> o) {
+checkUnnamed1229(core.List<api.MobileFriendlyIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileFriendlyIssue(o[0]);
   checkMobileFriendlyIssue(o[1]);
 }
 
-buildUnnamed1234() {
+buildUnnamed1230() {
   var o = new core.List<api.ResourceIssue>();
   o.add(buildResourceIssue());
   o.add(buildResourceIssue());
   return o;
 }
 
-checkUnnamed1234(core.List<api.ResourceIssue> o) {
+checkUnnamed1230(core.List<api.ResourceIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceIssue(o[0]);
   checkResourceIssue(o[1]);
@@ -182,8 +181,8 @@
   buildCounterRunMobileFriendlyTestResponse++;
   if (buildCounterRunMobileFriendlyTestResponse < 3) {
     o.mobileFriendliness = "foo";
-    o.mobileFriendlyIssues = buildUnnamed1233();
-    o.resourceIssues = buildUnnamed1234();
+    o.mobileFriendlyIssues = buildUnnamed1229();
+    o.resourceIssues = buildUnnamed1230();
     o.screenshot = buildImage();
     o.testStatus = buildTestStatus();
   }
@@ -195,8 +194,8 @@
   buildCounterRunMobileFriendlyTestResponse++;
   if (buildCounterRunMobileFriendlyTestResponse < 3) {
     unittest.expect(o.mobileFriendliness, unittest.equals('foo'));
-    checkUnnamed1233(o.mobileFriendlyIssues);
-    checkUnnamed1234(o.resourceIssues);
+    checkUnnamed1229(o.mobileFriendlyIssues);
+    checkUnnamed1230(o.resourceIssues);
     checkImage(o.screenshot);
     checkTestStatus(o.testStatus);
   }
@@ -224,7 +223,6 @@
   buildCounterTestStatus--;
 }
 
-
 main() {
   unittest.group("obj-schema-BlockedResource", () {
     unittest.test("to-json--from-json", () {
@@ -234,7 +232,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Image", () {
     unittest.test("to-json--from-json", () {
       var o = buildImage();
@@ -243,7 +240,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileFriendlyIssue", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileFriendlyIssue();
@@ -252,7 +248,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceIssue", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceIssue();
@@ -261,7 +256,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RunMobileFriendlyTestRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRunMobileFriendlyTestRequest();
@@ -270,7 +264,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RunMobileFriendlyTestResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRunMobileFriendlyTestResponse();
@@ -279,7 +272,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestStatus();
@@ -288,12 +280,11 @@
     });
   });
 
-
   unittest.group("resource-UrlTestingToolsMobileFriendlyTestResourceApi", () {
     unittest.test("method--run", () {
-
       var mock = new HttpServerMock();
-      api.UrlTestingToolsMobileFriendlyTestResourceApi res = new api.SearchconsoleApi(mock).urlTestingTools.mobileFriendlyTest;
+      api.UrlTestingToolsMobileFriendlyTestResourceApi res =
+          new api.SearchconsoleApi(mock).urlTestingTools.mobileFriendlyTest;
       var arg_request = buildRunMobileFriendlyTestRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.RunMobileFriendlyTestRequest.fromJson(json);
@@ -303,9 +294,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 41), unittest.equals("v1/urlTestingTools/mobileFriendlyTest:run"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 41),
+            unittest.equals("v1/urlTestingTools/mobileFriendlyTest:run"));
         pathOffset += 41;
 
         var query = (req.url).query;
@@ -318,27 +311,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRunMobileFriendlyTestResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.run(arg_request).then(unittest.expectAsync1(((api.RunMobileFriendlyTestResponse response) {
+      res.run(arg_request).then(
+          unittest.expectAsync1(((api.RunMobileFriendlyTestResponse response) {
         checkRunMobileFriendlyTestResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/servicecontrol/v1_test.dart b/generated/googleapis/test/servicecontrol/v1_test.dart
index 6f02350..5b147df 100644
--- a/generated/googleapis/test/servicecontrol/v1_test.dart
+++ b/generated/googleapis/test/servicecontrol/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.servicecontrol.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/servicecontrol/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -74,27 +73,27 @@
   buildCounterAllocateQuotaRequest--;
 }
 
-buildUnnamed1694() {
+buildUnnamed1690() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1694(core.List<api.QuotaError> o) {
+checkUnnamed1690(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
 }
 
-buildUnnamed1695() {
+buildUnnamed1691() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1695(core.List<api.MetricValueSet> o) {
+checkUnnamed1691(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
@@ -105,9 +104,9 @@
   var o = new api.AllocateQuotaResponse();
   buildCounterAllocateQuotaResponse++;
   if (buildCounterAllocateQuotaResponse < 3) {
-    o.allocateErrors = buildUnnamed1694();
+    o.allocateErrors = buildUnnamed1690();
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1695();
+    o.quotaMetrics = buildUnnamed1691();
     o.serviceConfigId = "foo";
   }
   buildCounterAllocateQuotaResponse--;
@@ -117,64 +116,112 @@
 checkAllocateQuotaResponse(api.AllocateQuotaResponse o) {
   buildCounterAllocateQuotaResponse++;
   if (buildCounterAllocateQuotaResponse < 3) {
-    checkUnnamed1694(o.allocateErrors);
+    checkUnnamed1690(o.allocateErrors);
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1695(o.quotaMetrics);
+    checkUnnamed1691(o.quotaMetrics);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterAllocateQuotaResponse--;
 }
 
-buildUnnamed1696() {
+buildUnnamed1692() {
   var o = new core.List<api.AuthorizationInfo>();
   o.add(buildAuthorizationInfo());
   o.add(buildAuthorizationInfo());
   return o;
 }
 
-checkUnnamed1696(core.List<api.AuthorizationInfo> o) {
+checkUnnamed1692(core.List<api.AuthorizationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthorizationInfo(o[0]);
   checkAuthorizationInfo(o[1]);
 }
 
-buildUnnamed1697() {
+buildUnnamed1693() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1697(core.Map<core.String, core.Object> o) {
+checkUnnamed1693(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1698() {
+buildUnnamed1694() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1698(core.Map<core.String, core.Object> o) {
+checkUnnamed1694(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1699() {
+buildUnnamed1695() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1699(core.Map<core.String, core.Object> o) {
+checkUnnamed1695(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterAuditLog = 0;
@@ -183,14 +230,14 @@
   buildCounterAuditLog++;
   if (buildCounterAuditLog < 3) {
     o.authenticationInfo = buildAuthenticationInfo();
-    o.authorizationInfo = buildUnnamed1696();
+    o.authorizationInfo = buildUnnamed1692();
     o.methodName = "foo";
     o.numResponseItems = "foo";
-    o.request = buildUnnamed1697();
+    o.request = buildUnnamed1693();
     o.requestMetadata = buildRequestMetadata();
     o.resourceName = "foo";
-    o.response = buildUnnamed1698();
-    o.serviceData = buildUnnamed1699();
+    o.response = buildUnnamed1694();
+    o.serviceData = buildUnnamed1695();
     o.serviceName = "foo";
     o.status = buildStatus();
   }
@@ -202,20 +249,49 @@
   buildCounterAuditLog++;
   if (buildCounterAuditLog < 3) {
     checkAuthenticationInfo(o.authenticationInfo);
-    checkUnnamed1696(o.authorizationInfo);
+    checkUnnamed1692(o.authorizationInfo);
     unittest.expect(o.methodName, unittest.equals('foo'));
     unittest.expect(o.numResponseItems, unittest.equals('foo'));
-    checkUnnamed1697(o.request);
+    checkUnnamed1693(o.request);
     checkRequestMetadata(o.requestMetadata);
     unittest.expect(o.resourceName, unittest.equals('foo'));
-    checkUnnamed1698(o.response);
-    checkUnnamed1699(o.serviceData);
+    checkUnnamed1694(o.response);
+    checkUnnamed1695(o.serviceData);
     unittest.expect(o.serviceName, unittest.equals('foo'));
     checkStatus(o.status);
   }
   buildCounterAuditLog--;
 }
 
+buildUnnamed1696() {
+  var o = new core.Map<core.String, core.Object>();
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  return o;
+}
+
+checkUnnamed1696(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
+}
+
 core.int buildCounterAuthenticationInfo = 0;
 buildAuthenticationInfo() {
   var o = new api.AuthenticationInfo();
@@ -223,6 +299,7 @@
   if (buildCounterAuthenticationInfo < 3) {
     o.authoritySelector = "foo";
     o.principalEmail = "foo";
+    o.thirdPartyPrincipal = buildUnnamed1696();
   }
   buildCounterAuthenticationInfo--;
   return o;
@@ -233,6 +310,7 @@
   if (buildCounterAuthenticationInfo < 3) {
     unittest.expect(o.authoritySelector, unittest.equals('foo'));
     unittest.expect(o.principalEmail, unittest.equals('foo'));
+    checkUnnamed1696(o.thirdPartyPrincipal);
   }
   buildCounterAuthenticationInfo--;
 }
@@ -281,14 +359,14 @@
   buildCounterCheckError--;
 }
 
-buildUnnamed1700() {
+buildUnnamed1697() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1700(core.List<core.String> o) {
+checkUnnamed1697(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -300,7 +378,7 @@
   buildCounterCheckInfo++;
   if (buildCounterCheckInfo < 3) {
     o.consumerInfo = buildConsumerInfo();
-    o.unusedArguments = buildUnnamed1700();
+    o.unusedArguments = buildUnnamed1697();
   }
   buildCounterCheckInfo--;
   return o;
@@ -310,7 +388,7 @@
   buildCounterCheckInfo++;
   if (buildCounterCheckInfo < 3) {
     checkConsumerInfo(o.consumerInfo);
-    checkUnnamed1700(o.unusedArguments);
+    checkUnnamed1697(o.unusedArguments);
   }
   buildCounterCheckInfo--;
 }
@@ -340,14 +418,14 @@
   buildCounterCheckRequest--;
 }
 
-buildUnnamed1701() {
+buildUnnamed1698() {
   var o = new core.List<api.CheckError>();
   o.add(buildCheckError());
   o.add(buildCheckError());
   return o;
 }
 
-checkUnnamed1701(core.List<api.CheckError> o) {
+checkUnnamed1698(core.List<api.CheckError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCheckError(o[0]);
   checkCheckError(o[1]);
@@ -358,7 +436,7 @@
   var o = new api.CheckResponse();
   buildCounterCheckResponse++;
   if (buildCounterCheckResponse < 3) {
-    o.checkErrors = buildUnnamed1701();
+    o.checkErrors = buildUnnamed1698();
     o.checkInfo = buildCheckInfo();
     o.operationId = "foo";
     o.quotaInfo = buildQuotaInfo();
@@ -371,7 +449,7 @@
 checkCheckResponse(api.CheckResponse o) {
   buildCounterCheckResponse++;
   if (buildCounterCheckResponse < 3) {
-    checkUnnamed1701(o.checkErrors);
+    checkUnnamed1698(o.checkErrors);
     checkCheckInfo(o.checkInfo);
     unittest.expect(o.operationId, unittest.equals('foo'));
     checkQuotaInfo(o.quotaInfo);
@@ -399,14 +477,14 @@
   buildCounterConsumerInfo--;
 }
 
-buildUnnamed1702() {
+buildUnnamed1699() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1702(core.List<core.String> o) {
+checkUnnamed1699(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -417,7 +495,7 @@
   var o = new api.Distribution();
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
-    o.bucketCounts = buildUnnamed1702();
+    o.bucketCounts = buildUnnamed1699();
     o.count = "foo";
     o.explicitBuckets = buildExplicitBuckets();
     o.exponentialBuckets = buildExponentialBuckets();
@@ -434,7 +512,7 @@
 checkDistribution(api.Distribution o) {
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
-    checkUnnamed1702(o.bucketCounts);
+    checkUnnamed1699(o.bucketCounts);
     unittest.expect(o.count, unittest.equals('foo'));
     checkExplicitBuckets(o.explicitBuckets);
     checkExponentialBuckets(o.exponentialBuckets);
@@ -468,27 +546,27 @@
   buildCounterEndReconciliationRequest--;
 }
 
-buildUnnamed1703() {
+buildUnnamed1700() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1703(core.List<api.MetricValueSet> o) {
+checkUnnamed1700(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1704() {
+buildUnnamed1701() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1704(core.List<api.QuotaError> o) {
+checkUnnamed1701(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
@@ -500,8 +578,8 @@
   buildCounterEndReconciliationResponse++;
   if (buildCounterEndReconciliationResponse < 3) {
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1703();
-    o.reconciliationErrors = buildUnnamed1704();
+    o.quotaMetrics = buildUnnamed1700();
+    o.reconciliationErrors = buildUnnamed1701();
     o.serviceConfigId = "foo";
   }
   buildCounterEndReconciliationResponse--;
@@ -512,21 +590,21 @@
   buildCounterEndReconciliationResponse++;
   if (buildCounterEndReconciliationResponse < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1703(o.quotaMetrics);
-    checkUnnamed1704(o.reconciliationErrors);
+    checkUnnamed1700(o.quotaMetrics);
+    checkUnnamed1701(o.reconciliationErrors);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterEndReconciliationResponse--;
 }
 
-buildUnnamed1705() {
+buildUnnamed1702() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1705(core.List<core.double> o) {
+checkUnnamed1702(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -537,7 +615,7 @@
   var o = new api.ExplicitBuckets();
   buildCounterExplicitBuckets++;
   if (buildCounterExplicitBuckets < 3) {
-    o.bounds = buildUnnamed1705();
+    o.bounds = buildUnnamed1702();
   }
   buildCounterExplicitBuckets--;
   return o;
@@ -546,7 +624,7 @@
 checkExplicitBuckets(api.ExplicitBuckets o) {
   buildCounterExplicitBuckets++;
   if (buildCounterExplicitBuckets < 3) {
-    checkUnnamed1705(o.bounds);
+    checkUnnamed1702(o.bounds);
   }
   buildCounterExplicitBuckets--;
 }
@@ -597,43 +675,75 @@
   buildCounterLinearBuckets--;
 }
 
-buildUnnamed1706() {
+buildUnnamed1703() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1706(core.Map<core.String, core.String> o) {
+checkUnnamed1703(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1707() {
+buildUnnamed1704() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1707(core.Map<core.String, core.Object> o) {
+checkUnnamed1704(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted9 = (o["x"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o["y"]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1708() {
+buildUnnamed1705() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1708(core.Map<core.String, core.Object> o) {
+checkUnnamed1705(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o["x"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o["y"]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+  var casted11 = (o["x"]) as core.Map;
+  unittest.expect(casted11, unittest.hasLength(3));
+  unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted11["bool"], unittest.equals(true));
+  unittest.expect(casted11["string"], unittest.equals('foo'));
+  var casted12 = (o["y"]) as core.Map;
+  unittest.expect(casted12, unittest.hasLength(3));
+  unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted12["bool"], unittest.equals(true));
+  unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterLogEntry = 0;
@@ -642,11 +752,11 @@
   buildCounterLogEntry++;
   if (buildCounterLogEntry < 3) {
     o.insertId = "foo";
-    o.labels = buildUnnamed1706();
+    o.labels = buildUnnamed1703();
     o.name = "foo";
-    o.protoPayload = buildUnnamed1707();
+    o.protoPayload = buildUnnamed1704();
     o.severity = "foo";
-    o.structPayload = buildUnnamed1708();
+    o.structPayload = buildUnnamed1705();
     o.textPayload = "foo";
     o.timestamp = "foo";
   }
@@ -658,25 +768,25 @@
   buildCounterLogEntry++;
   if (buildCounterLogEntry < 3) {
     unittest.expect(o.insertId, unittest.equals('foo'));
-    checkUnnamed1706(o.labels);
+    checkUnnamed1703(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1707(o.protoPayload);
+    checkUnnamed1704(o.protoPayload);
     unittest.expect(o.severity, unittest.equals('foo'));
-    checkUnnamed1708(o.structPayload);
+    checkUnnamed1705(o.structPayload);
     unittest.expect(o.textPayload, unittest.equals('foo'));
     unittest.expect(o.timestamp, unittest.equals('foo'));
   }
   buildCounterLogEntry--;
 }
 
-buildUnnamed1709() {
+buildUnnamed1706() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1709(core.Map<core.String, core.String> o) {
+checkUnnamed1706(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -692,7 +802,7 @@
     o.doubleValue = 42.0;
     o.endTime = "foo";
     o.int64Value = "foo";
-    o.labels = buildUnnamed1709();
+    o.labels = buildUnnamed1706();
     o.moneyValue = buildMoney();
     o.startTime = "foo";
     o.stringValue = "foo";
@@ -709,7 +819,7 @@
     unittest.expect(o.doubleValue, unittest.equals(42.0));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.int64Value, unittest.equals('foo'));
-    checkUnnamed1709(o.labels);
+    checkUnnamed1706(o.labels);
     checkMoney(o.moneyValue);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -717,14 +827,14 @@
   buildCounterMetricValue--;
 }
 
-buildUnnamed1710() {
+buildUnnamed1707() {
   var o = new core.List<api.MetricValue>();
   o.add(buildMetricValue());
   o.add(buildMetricValue());
   return o;
 }
 
-checkUnnamed1710(core.List<api.MetricValue> o) {
+checkUnnamed1707(core.List<api.MetricValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValue(o[0]);
   checkMetricValue(o[1]);
@@ -736,7 +846,7 @@
   buildCounterMetricValueSet++;
   if (buildCounterMetricValueSet < 3) {
     o.metricName = "foo";
-    o.metricValues = buildUnnamed1710();
+    o.metricValues = buildUnnamed1707();
   }
   buildCounterMetricValueSet--;
   return o;
@@ -746,7 +856,7 @@
   buildCounterMetricValueSet++;
   if (buildCounterMetricValueSet < 3) {
     unittest.expect(o.metricName, unittest.equals('foo'));
-    checkUnnamed1710(o.metricValues);
+    checkUnnamed1707(o.metricValues);
   }
   buildCounterMetricValueSet--;
 }
@@ -774,53 +884,66 @@
   buildCounterMoney--;
 }
 
-buildUnnamed1711() {
+buildUnnamed1708() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1711(core.Map<core.String, core.String> o) {
+checkUnnamed1708(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1712() {
+buildUnnamed1709() {
   var o = new core.List<api.LogEntry>();
   o.add(buildLogEntry());
   o.add(buildLogEntry());
   return o;
 }
 
-checkUnnamed1712(core.List<api.LogEntry> o) {
+checkUnnamed1709(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogEntry(o[0]);
   checkLogEntry(o[1]);
 }
 
-buildUnnamed1713() {
+buildUnnamed1710() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1713(core.List<api.MetricValueSet> o) {
+checkUnnamed1710(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1714() {
+buildUnnamed1711() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1711(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1712() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1714(core.Map<core.String, core.String> o) {
+checkUnnamed1712(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -834,15 +957,16 @@
     o.consumerId = "foo";
     o.endTime = "foo";
     o.importance = "foo";
-    o.labels = buildUnnamed1711();
-    o.logEntries = buildUnnamed1712();
-    o.metricValueSets = buildUnnamed1713();
+    o.labels = buildUnnamed1708();
+    o.logEntries = buildUnnamed1709();
+    o.metricValueSets = buildUnnamed1710();
     o.operationId = "foo";
     o.operationName = "foo";
     o.quotaProperties = buildQuotaProperties();
     o.resourceContainer = "foo";
+    o.resourceContainers = buildUnnamed1711();
     o.startTime = "foo";
-    o.userLabels = buildUnnamed1714();
+    o.userLabels = buildUnnamed1712();
   }
   buildCounterOperation--;
   return o;
@@ -854,15 +978,16 @@
     unittest.expect(o.consumerId, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.importance, unittest.equals('foo'));
-    checkUnnamed1711(o.labels);
-    checkUnnamed1712(o.logEntries);
-    checkUnnamed1713(o.metricValueSets);
+    checkUnnamed1708(o.labels);
+    checkUnnamed1709(o.logEntries);
+    checkUnnamed1710(o.metricValueSets);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.operationName, unittest.equals('foo'));
     checkQuotaProperties(o.quotaProperties);
     unittest.expect(o.resourceContainer, unittest.equals('foo'));
+    checkUnnamed1711(o.resourceContainers);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkUnnamed1714(o.userLabels);
+    checkUnnamed1712(o.userLabels);
   }
   buildCounterOperation--;
 }
@@ -890,32 +1015,81 @@
   buildCounterQuotaError--;
 }
 
-buildUnnamed1715() {
+buildUnnamed1713() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1715(core.List<core.String> o) {
+checkUnnamed1713(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1716() {
+buildUnnamed1714() {
   var o = new core.Map<core.String, core.int>();
   o["x"] = 42;
   o["y"] = 42;
   return o;
 }
 
-checkUnnamed1716(core.Map<core.String, core.int> o) {
+checkUnnamed1714(core.Map<core.String, core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42));
   unittest.expect(o["y"], unittest.equals(42));
 }
 
+buildUnnamed1715() {
+  var o = new core.List<api.MetricValueSet>();
+  o.add(buildMetricValueSet());
+  o.add(buildMetricValueSet());
+  return o;
+}
+
+checkUnnamed1715(core.List<api.MetricValueSet> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMetricValueSet(o[0]);
+  checkMetricValueSet(o[1]);
+}
+
+core.int buildCounterQuotaInfo = 0;
+buildQuotaInfo() {
+  var o = new api.QuotaInfo();
+  buildCounterQuotaInfo++;
+  if (buildCounterQuotaInfo < 3) {
+    o.limitExceeded = buildUnnamed1713();
+    o.quotaConsumed = buildUnnamed1714();
+    o.quotaMetrics = buildUnnamed1715();
+  }
+  buildCounterQuotaInfo--;
+  return o;
+}
+
+checkQuotaInfo(api.QuotaInfo o) {
+  buildCounterQuotaInfo++;
+  if (buildCounterQuotaInfo < 3) {
+    checkUnnamed1713(o.limitExceeded);
+    checkUnnamed1714(o.quotaConsumed);
+    checkUnnamed1715(o.quotaMetrics);
+  }
+  buildCounterQuotaInfo--;
+}
+
+buildUnnamed1716() {
+  var o = new core.Map<core.String, core.String>();
+  o["x"] = "foo";
+  o["y"] = "foo";
+  return o;
+}
+
+checkUnnamed1716(core.Map<core.String, core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals('foo'));
+  unittest.expect(o["y"], unittest.equals('foo'));
+}
+
 buildUnnamed1717() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
@@ -929,27 +1103,33 @@
   checkMetricValueSet(o[1]);
 }
 
-core.int buildCounterQuotaInfo = 0;
-buildQuotaInfo() {
-  var o = new api.QuotaInfo();
-  buildCounterQuotaInfo++;
-  if (buildCounterQuotaInfo < 3) {
-    o.limitExceeded = buildUnnamed1715();
-    o.quotaConsumed = buildUnnamed1716();
+core.int buildCounterQuotaOperation = 0;
+buildQuotaOperation() {
+  var o = new api.QuotaOperation();
+  buildCounterQuotaOperation++;
+  if (buildCounterQuotaOperation < 3) {
+    o.consumerId = "foo";
+    o.labels = buildUnnamed1716();
+    o.methodName = "foo";
+    o.operationId = "foo";
     o.quotaMetrics = buildUnnamed1717();
+    o.quotaMode = "foo";
   }
-  buildCounterQuotaInfo--;
+  buildCounterQuotaOperation--;
   return o;
 }
 
-checkQuotaInfo(api.QuotaInfo o) {
-  buildCounterQuotaInfo++;
-  if (buildCounterQuotaInfo < 3) {
-    checkUnnamed1715(o.limitExceeded);
-    checkUnnamed1716(o.quotaConsumed);
+checkQuotaOperation(api.QuotaOperation o) {
+  buildCounterQuotaOperation++;
+  if (buildCounterQuotaOperation < 3) {
+    unittest.expect(o.consumerId, unittest.equals('foo'));
+    checkUnnamed1716(o.labels);
+    unittest.expect(o.methodName, unittest.equals('foo'));
+    unittest.expect(o.operationId, unittest.equals('foo'));
     checkUnnamed1717(o.quotaMetrics);
+    unittest.expect(o.quotaMode, unittest.equals('foo'));
   }
-  buildCounterQuotaInfo--;
+  buildCounterQuotaOperation--;
 }
 
 buildUnnamed1718() {
@@ -965,67 +1145,12 @@
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1719() {
-  var o = new core.List<api.MetricValueSet>();
-  o.add(buildMetricValueSet());
-  o.add(buildMetricValueSet());
-  return o;
-}
-
-checkUnnamed1719(core.List<api.MetricValueSet> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMetricValueSet(o[0]);
-  checkMetricValueSet(o[1]);
-}
-
-core.int buildCounterQuotaOperation = 0;
-buildQuotaOperation() {
-  var o = new api.QuotaOperation();
-  buildCounterQuotaOperation++;
-  if (buildCounterQuotaOperation < 3) {
-    o.consumerId = "foo";
-    o.labels = buildUnnamed1718();
-    o.methodName = "foo";
-    o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1719();
-    o.quotaMode = "foo";
-  }
-  buildCounterQuotaOperation--;
-  return o;
-}
-
-checkQuotaOperation(api.QuotaOperation o) {
-  buildCounterQuotaOperation++;
-  if (buildCounterQuotaOperation < 3) {
-    unittest.expect(o.consumerId, unittest.equals('foo'));
-    checkUnnamed1718(o.labels);
-    unittest.expect(o.methodName, unittest.equals('foo'));
-    unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1719(o.quotaMetrics);
-    unittest.expect(o.quotaMode, unittest.equals('foo'));
-  }
-  buildCounterQuotaOperation--;
-}
-
-buildUnnamed1720() {
-  var o = new core.Map<core.String, core.String>();
-  o["x"] = "foo";
-  o["y"] = "foo";
-  return o;
-}
-
-checkUnnamed1720(core.Map<core.String, core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals('foo'));
-  unittest.expect(o["y"], unittest.equals('foo'));
-}
-
 core.int buildCounterQuotaProperties = 0;
 buildQuotaProperties() {
   var o = new api.QuotaProperties();
   buildCounterQuotaProperties++;
   if (buildCounterQuotaProperties < 3) {
-    o.limitByIds = buildUnnamed1720();
+    o.limitByIds = buildUnnamed1718();
     o.quotaMode = "foo";
   }
   buildCounterQuotaProperties--;
@@ -1035,7 +1160,7 @@
 checkQuotaProperties(api.QuotaProperties o) {
   buildCounterQuotaProperties++;
   if (buildCounterQuotaProperties < 3) {
-    checkUnnamed1720(o.limitByIds);
+    checkUnnamed1718(o.limitByIds);
     unittest.expect(o.quotaMode, unittest.equals('foo'));
   }
   buildCounterQuotaProperties--;
@@ -1062,27 +1187,27 @@
   buildCounterReleaseQuotaRequest--;
 }
 
-buildUnnamed1721() {
+buildUnnamed1719() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1721(core.List<api.MetricValueSet> o) {
+checkUnnamed1719(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1722() {
+buildUnnamed1720() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1722(core.List<api.QuotaError> o) {
+checkUnnamed1720(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
@@ -1094,8 +1219,8 @@
   buildCounterReleaseQuotaResponse++;
   if (buildCounterReleaseQuotaResponse < 3) {
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1721();
-    o.releaseErrors = buildUnnamed1722();
+    o.quotaMetrics = buildUnnamed1719();
+    o.releaseErrors = buildUnnamed1720();
     o.serviceConfigId = "foo";
   }
   buildCounterReleaseQuotaResponse--;
@@ -1106,8 +1231,8 @@
   buildCounterReleaseQuotaResponse++;
   if (buildCounterReleaseQuotaResponse < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1721(o.quotaMetrics);
-    checkUnnamed1722(o.releaseErrors);
+    checkUnnamed1719(o.quotaMetrics);
+    checkUnnamed1720(o.releaseErrors);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterReleaseQuotaResponse--;
@@ -1155,14 +1280,14 @@
   buildCounterReportInfo--;
 }
 
-buildUnnamed1723() {
+buildUnnamed1721() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1723(core.List<api.Operation> o) {
+checkUnnamed1721(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1173,7 +1298,7 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.operations = buildUnnamed1723();
+    o.operations = buildUnnamed1721();
     o.serviceConfigId = "foo";
   }
   buildCounterReportRequest--;
@@ -1183,33 +1308,33 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed1723(o.operations);
+    checkUnnamed1721(o.operations);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterReportRequest--;
 }
 
-buildUnnamed1724() {
+buildUnnamed1722() {
   var o = new core.List<api.ReportError>();
   o.add(buildReportError());
   o.add(buildReportError());
   return o;
 }
 
-checkUnnamed1724(core.List<api.ReportError> o) {
+checkUnnamed1722(core.List<api.ReportError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportError(o[0]);
   checkReportError(o[1]);
 }
 
-buildUnnamed1725() {
+buildUnnamed1723() {
   var o = new core.List<api.ReportInfo>();
   o.add(buildReportInfo());
   o.add(buildReportInfo());
   return o;
 }
 
-checkUnnamed1725(core.List<api.ReportInfo> o) {
+checkUnnamed1723(core.List<api.ReportInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportInfo(o[0]);
   checkReportInfo(o[1]);
@@ -1220,8 +1345,8 @@
   var o = new api.ReportResponse();
   buildCounterReportResponse++;
   if (buildCounterReportResponse < 3) {
-    o.reportErrors = buildUnnamed1724();
-    o.reportInfos = buildUnnamed1725();
+    o.reportErrors = buildUnnamed1722();
+    o.reportInfos = buildUnnamed1723();
     o.serviceConfigId = "foo";
   }
   buildCounterReportResponse--;
@@ -1231,8 +1356,8 @@
 checkReportResponse(api.ReportResponse o) {
   buildCounterReportResponse++;
   if (buildCounterReportResponse < 3) {
-    checkUnnamed1724(o.reportErrors);
-    checkUnnamed1725(o.reportInfos);
+    checkUnnamed1722(o.reportErrors);
+    checkUnnamed1723(o.reportInfos);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterReportResponse--;
@@ -1280,27 +1405,27 @@
   buildCounterStartReconciliationRequest--;
 }
 
-buildUnnamed1726() {
+buildUnnamed1724() {
   var o = new core.List<api.MetricValueSet>();
   o.add(buildMetricValueSet());
   o.add(buildMetricValueSet());
   return o;
 }
 
-checkUnnamed1726(core.List<api.MetricValueSet> o) {
+checkUnnamed1724(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricValueSet(o[0]);
   checkMetricValueSet(o[1]);
 }
 
-buildUnnamed1727() {
+buildUnnamed1725() {
   var o = new core.List<api.QuotaError>();
   o.add(buildQuotaError());
   o.add(buildQuotaError());
   return o;
 }
 
-checkUnnamed1727(core.List<api.QuotaError> o) {
+checkUnnamed1725(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaError(o[0]);
   checkQuotaError(o[1]);
@@ -1312,8 +1437,8 @@
   buildCounterStartReconciliationResponse++;
   if (buildCounterStartReconciliationResponse < 3) {
     o.operationId = "foo";
-    o.quotaMetrics = buildUnnamed1726();
-    o.reconciliationErrors = buildUnnamed1727();
+    o.quotaMetrics = buildUnnamed1724();
+    o.reconciliationErrors = buildUnnamed1725();
     o.serviceConfigId = "foo";
   }
   buildCounterStartReconciliationResponse--;
@@ -1324,37 +1449,53 @@
   buildCounterStartReconciliationResponse++;
   if (buildCounterStartReconciliationResponse < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed1726(o.quotaMetrics);
-    checkUnnamed1727(o.reconciliationErrors);
+    checkUnnamed1724(o.quotaMetrics);
+    checkUnnamed1725(o.reconciliationErrors);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterStartReconciliationResponse--;
 }
 
-buildUnnamed1728() {
+buildUnnamed1726() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1728(core.Map<core.String, core.Object> o) {
+checkUnnamed1726(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted11 = (o["x"]) as core.Map; unittest.expect(casted11, unittest.hasLength(3)); unittest.expect(casted11["list"], unittest.equals([1, 2, 3])); unittest.expect(casted11["bool"], unittest.equals(true)); unittest.expect(casted11["string"], unittest.equals('foo')); 
-  var casted12 = (o["y"]) as core.Map; unittest.expect(casted12, unittest.hasLength(3)); unittest.expect(casted12["list"], unittest.equals([1, 2, 3])); unittest.expect(casted12["bool"], unittest.equals(true)); unittest.expect(casted12["string"], unittest.equals('foo')); 
+  var casted13 = (o["x"]) as core.Map;
+  unittest.expect(casted13, unittest.hasLength(3));
+  unittest.expect(casted13["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted13["bool"], unittest.equals(true));
+  unittest.expect(casted13["string"], unittest.equals('foo'));
+  var casted14 = (o["y"]) as core.Map;
+  unittest.expect(casted14, unittest.hasLength(3));
+  unittest.expect(casted14["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted14["bool"], unittest.equals(true));
+  unittest.expect(casted14["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1729() {
+buildUnnamed1727() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1728());
-  o.add(buildUnnamed1728());
+  o.add(buildUnnamed1726());
+  o.add(buildUnnamed1726());
   return o;
 }
 
-checkUnnamed1729(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1727(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1728(o[0]);
-  checkUnnamed1728(o[1]);
+  checkUnnamed1726(o[0]);
+  checkUnnamed1726(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1363,7 +1504,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1729();
+    o.details = buildUnnamed1727();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1374,13 +1515,12 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1729(o.details);
+    checkUnnamed1727(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-
 main() {
   unittest.group("obj-schema-AllocateQuotaRequest", () {
     unittest.test("to-json--from-json", () {
@@ -1390,7 +1530,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AllocateQuotaResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAllocateQuotaResponse();
@@ -1399,7 +1538,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLog", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLog();
@@ -1408,7 +1546,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthenticationInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthenticationInfo();
@@ -1417,7 +1554,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthorizationInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthorizationInfo();
@@ -1426,7 +1562,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CheckError", () {
     unittest.test("to-json--from-json", () {
       var o = buildCheckError();
@@ -1435,7 +1570,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CheckInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildCheckInfo();
@@ -1444,7 +1578,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CheckRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCheckRequest();
@@ -1453,7 +1586,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CheckResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCheckResponse();
@@ -1462,7 +1594,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConsumerInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildConsumerInfo();
@@ -1471,7 +1602,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Distribution", () {
     unittest.test("to-json--from-json", () {
       var o = buildDistribution();
@@ -1480,7 +1610,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EndReconciliationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEndReconciliationRequest();
@@ -1489,7 +1618,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EndReconciliationResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildEndReconciliationResponse();
@@ -1498,7 +1626,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExplicitBuckets", () {
     unittest.test("to-json--from-json", () {
       var o = buildExplicitBuckets();
@@ -1507,7 +1634,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExponentialBuckets", () {
     unittest.test("to-json--from-json", () {
       var o = buildExponentialBuckets();
@@ -1516,7 +1642,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LinearBuckets", () {
     unittest.test("to-json--from-json", () {
       var o = buildLinearBuckets();
@@ -1525,7 +1650,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogEntry();
@@ -1534,7 +1658,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricValue();
@@ -1543,7 +1666,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricValueSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricValueSet();
@@ -1552,7 +1674,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Money", () {
     unittest.test("to-json--from-json", () {
       var o = buildMoney();
@@ -1561,7 +1682,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -1570,7 +1690,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuotaError", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuotaError();
@@ -1579,7 +1698,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuotaInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuotaInfo();
@@ -1588,7 +1706,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuotaOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuotaOperation();
@@ -1597,7 +1714,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuotaProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuotaProperties();
@@ -1606,7 +1722,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReleaseQuotaRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReleaseQuotaRequest();
@@ -1615,7 +1730,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReleaseQuotaResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReleaseQuotaResponse();
@@ -1624,7 +1738,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportError", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportError();
@@ -1633,7 +1746,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportInfo();
@@ -1642,7 +1754,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportRequest();
@@ -1651,7 +1762,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportResponse();
@@ -1660,7 +1770,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RequestMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildRequestMetadata();
@@ -1669,7 +1778,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StartReconciliationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildStartReconciliationRequest();
@@ -1678,7 +1786,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StartReconciliationResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildStartReconciliationResponse();
@@ -1687,7 +1794,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1696,10 +1802,8 @@
     });
   });
 
-
   unittest.group("resource-ServicesResourceApi", () {
     unittest.test("method--allocateQuota", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicecontrolApi(mock).services;
       var arg_request = buildAllocateQuotaRequest();
@@ -1712,16 +1816,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":allocateQuota", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals(":allocateQuota"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals(":allocateQuota"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -1734,27 +1842,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildAllocateQuotaResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.allocateQuota(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.AllocateQuotaResponse response) {
+      res
+          .allocateQuota(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.AllocateQuotaResponse response) {
         checkAllocateQuotaResponse(response);
       })));
     });
 
     unittest.test("method--check", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicecontrolApi(mock).services;
       var arg_request = buildCheckRequest();
@@ -1767,16 +1877,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":check", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals(":check"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals(":check"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1789,27 +1903,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCheckResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.check(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.CheckResponse response) {
+      res
+          .check(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.CheckResponse response) {
         checkCheckResponse(response);
       })));
     });
 
     unittest.test("method--endReconciliation", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicecontrolApi(mock).services;
       var arg_request = buildEndReconciliationRequest();
@@ -1822,16 +1938,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":endReconciliation", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals(":endReconciliation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals(":endReconciliation"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -1844,27 +1964,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEndReconciliationResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.endReconciliation(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.EndReconciliationResponse response) {
+      res.endReconciliation(arg_request, arg_serviceName).then(
+          unittest.expectAsync1(((api.EndReconciliationResponse response) {
         checkEndReconciliationResponse(response);
       })));
     });
 
     unittest.test("method--releaseQuota", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicecontrolApi(mock).services;
       var arg_request = buildReleaseQuotaRequest();
@@ -1877,16 +1998,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":releaseQuota", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals(":releaseQuota"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals(":releaseQuota"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -1899,27 +2024,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReleaseQuotaResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.releaseQuota(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.ReleaseQuotaResponse response) {
+      res
+          .releaseQuota(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.ReleaseQuotaResponse response) {
         checkReleaseQuotaResponse(response);
       })));
     });
 
     unittest.test("method--report", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicecontrolApi(mock).services;
       var arg_request = buildReportRequest();
@@ -1932,16 +2059,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":report", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":report"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":report"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1954,27 +2085,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReportResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.report(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.ReportResponse response) {
+      res
+          .report(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.ReportResponse response) {
         checkReportResponse(response);
       })));
     });
 
     unittest.test("method--startReconciliation", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicecontrolApi(mock).services;
       var arg_request = buildStartReconciliationRequest();
@@ -1987,16 +2120,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":startReconciliation", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals(":startReconciliation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals(":startReconciliation"));
         pathOffset += 20;
 
         var query = (req.url).query;
@@ -2009,27 +2146,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildStartReconciliationResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.startReconciliation(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.StartReconciliationResponse response) {
+      res.startReconciliation(arg_request, arg_serviceName).then(
+          unittest.expectAsync1(((api.StartReconciliationResponse response) {
         checkStartReconciliationResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/servicemanagement/v1_test.dart b/generated/googleapis/test/servicemanagement/v1_test.dart
index 22667e3..bf8796a 100644
--- a/generated/googleapis/test/servicemanagement/v1_test.dart
+++ b/generated/googleapis/test/servicemanagement/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.servicemanagement.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/servicemanagement/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -70,40 +69,40 @@
   buildCounterAdvice--;
 }
 
-buildUnnamed1141() {
+buildUnnamed1144() {
   var o = new core.List<api.Method>();
   o.add(buildMethod());
   o.add(buildMethod());
   return o;
 }
 
-checkUnnamed1141(core.List<api.Method> o) {
+checkUnnamed1144(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMethod(o[0]);
   checkMethod(o[1]);
 }
 
-buildUnnamed1142() {
+buildUnnamed1145() {
   var o = new core.List<api.Mixin>();
   o.add(buildMixin());
   o.add(buildMixin());
   return o;
 }
 
-checkUnnamed1142(core.List<api.Mixin> o) {
+checkUnnamed1145(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMixin(o[0]);
   checkMixin(o[1]);
 }
 
-buildUnnamed1143() {
+buildUnnamed1146() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1143(core.List<api.Option> o) {
+checkUnnamed1146(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -114,10 +113,10 @@
   var o = new api.Api();
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    o.methods = buildUnnamed1141();
-    o.mixins = buildUnnamed1142();
+    o.methods = buildUnnamed1144();
+    o.mixins = buildUnnamed1145();
     o.name = "foo";
-    o.options = buildUnnamed1143();
+    o.options = buildUnnamed1146();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
     o.version = "foo";
@@ -129,10 +128,10 @@
 checkApi(api.Api o) {
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    checkUnnamed1141(o.methods);
-    checkUnnamed1142(o.mixins);
+    checkUnnamed1144(o.methods);
+    checkUnnamed1145(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1143(o.options);
+    checkUnnamed1146(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -140,27 +139,27 @@
   buildCounterApi--;
 }
 
-buildUnnamed1144() {
+buildUnnamed1147() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed1144(core.List<api.AuditLogConfig> o) {
+checkUnnamed1147(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
-buildUnnamed1145() {
+buildUnnamed1148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1145(core.List<core.String> o) {
+checkUnnamed1148(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -171,8 +170,8 @@
   var o = new api.AuditConfig();
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed1144();
-    o.exemptedMembers = buildUnnamed1145();
+    o.auditLogConfigs = buildUnnamed1147();
+    o.exemptedMembers = buildUnnamed1148();
     o.service = "foo";
   }
   buildCounterAuditConfig--;
@@ -182,21 +181,21 @@
 checkAuditConfig(api.AuditConfig o) {
   buildCounterAuditConfig++;
   if (buildCounterAuditConfig < 3) {
-    checkUnnamed1144(o.auditLogConfigs);
-    checkUnnamed1145(o.exemptedMembers);
+    checkUnnamed1147(o.auditLogConfigs);
+    checkUnnamed1148(o.exemptedMembers);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterAuditConfig--;
 }
 
-buildUnnamed1146() {
+buildUnnamed1149() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1146(core.List<core.String> o) {
+checkUnnamed1149(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -207,7 +206,7 @@
   var o = new api.AuditLogConfig();
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed1146();
+    o.exemptedMembers = buildUnnamed1149();
     o.logType = "foo";
   }
   buildCounterAuditLogConfig--;
@@ -217,7 +216,7 @@
 checkAuditLogConfig(api.AuditLogConfig o) {
   buildCounterAuditLogConfig++;
   if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed1146(o.exemptedMembers);
+    checkUnnamed1149(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterAuditLogConfig--;
@@ -271,27 +270,27 @@
   buildCounterAuthRequirement--;
 }
 
-buildUnnamed1147() {
+buildUnnamed1150() {
   var o = new core.List<api.AuthProvider>();
   o.add(buildAuthProvider());
   o.add(buildAuthProvider());
   return o;
 }
 
-checkUnnamed1147(core.List<api.AuthProvider> o) {
+checkUnnamed1150(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthProvider(o[0]);
   checkAuthProvider(o[1]);
 }
 
-buildUnnamed1148() {
+buildUnnamed1151() {
   var o = new core.List<api.AuthenticationRule>();
   o.add(buildAuthenticationRule());
   o.add(buildAuthenticationRule());
   return o;
 }
 
-checkUnnamed1148(core.List<api.AuthenticationRule> o) {
+checkUnnamed1151(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthenticationRule(o[0]);
   checkAuthenticationRule(o[1]);
@@ -302,8 +301,8 @@
   var o = new api.Authentication();
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    o.providers = buildUnnamed1147();
-    o.rules = buildUnnamed1148();
+    o.providers = buildUnnamed1150();
+    o.rules = buildUnnamed1151();
   }
   buildCounterAuthentication--;
   return o;
@@ -312,20 +311,20 @@
 checkAuthentication(api.Authentication o) {
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    checkUnnamed1147(o.providers);
-    checkUnnamed1148(o.rules);
+    checkUnnamed1150(o.providers);
+    checkUnnamed1151(o.rules);
   }
   buildCounterAuthentication--;
 }
 
-buildUnnamed1149() {
+buildUnnamed1152() {
   var o = new core.List<api.AuthRequirement>();
   o.add(buildAuthRequirement());
   o.add(buildAuthRequirement());
   return o;
 }
 
-checkUnnamed1149(core.List<api.AuthRequirement> o) {
+checkUnnamed1152(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthRequirement(o[0]);
   checkAuthRequirement(o[1]);
@@ -339,7 +338,7 @@
     o.allowWithoutCredential = true;
     o.customAuth = buildCustomAuthRequirements();
     o.oauth = buildOAuthRequirements();
-    o.requirements = buildUnnamed1149();
+    o.requirements = buildUnnamed1152();
     o.selector = "foo";
   }
   buildCounterAuthenticationRule--;
@@ -352,7 +351,7 @@
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
     checkCustomAuthRequirements(o.customAuth);
     checkOAuthRequirements(o.oauth);
-    checkUnnamed1149(o.requirements);
+    checkUnnamed1152(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterAuthenticationRule--;
@@ -377,14 +376,14 @@
   buildCounterAuthorizationConfig--;
 }
 
-buildUnnamed1150() {
+buildUnnamed1153() {
   var o = new core.List<api.BackendRule>();
   o.add(buildBackendRule());
   o.add(buildBackendRule());
   return o;
 }
 
-checkUnnamed1150(core.List<api.BackendRule> o) {
+checkUnnamed1153(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendRule(o[0]);
   checkBackendRule(o[1]);
@@ -395,7 +394,7 @@
   var o = new api.Backend();
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    o.rules = buildUnnamed1150();
+    o.rules = buildUnnamed1153();
   }
   buildCounterBackend--;
   return o;
@@ -404,7 +403,7 @@
 checkBackend(api.Backend o) {
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    checkUnnamed1150(o.rules);
+    checkUnnamed1153(o.rules);
   }
   buildCounterBackend--;
 }
@@ -434,14 +433,14 @@
   buildCounterBackendRule--;
 }
 
-buildUnnamed1151() {
+buildUnnamed1154() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1151(core.List<core.String> o) {
+checkUnnamed1154(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -453,7 +452,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     o.condition = buildExpr();
-    o.members = buildUnnamed1151();
+    o.members = buildUnnamed1154();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -464,20 +463,20 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     checkExpr(o.condition);
-    checkUnnamed1151(o.members);
+    checkUnnamed1154(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
 }
 
-buildUnnamed1152() {
+buildUnnamed1155() {
   var o = new core.List<api.ConfigChange>();
   o.add(buildConfigChange());
   o.add(buildConfigChange());
   return o;
 }
 
-checkUnnamed1152(core.List<api.ConfigChange> o) {
+checkUnnamed1155(core.List<api.ConfigChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConfigChange(o[0]);
   checkConfigChange(o[1]);
@@ -488,7 +487,7 @@
   var o = new api.ChangeReport();
   buildCounterChangeReport++;
   if (buildCounterChangeReport < 3) {
-    o.configChanges = buildUnnamed1152();
+    o.configChanges = buildUnnamed1155();
   }
   buildCounterChangeReport--;
   return o;
@@ -497,80 +496,19 @@
 checkChangeReport(api.ChangeReport o) {
   buildCounterChangeReport++;
   if (buildCounterChangeReport < 3) {
-    checkUnnamed1152(o.configChanges);
+    checkUnnamed1155(o.configChanges);
   }
   buildCounterChangeReport--;
 }
 
-core.int buildCounterCloudAuditOptions = 0;
-buildCloudAuditOptions() {
-  var o = new api.CloudAuditOptions();
-  buildCounterCloudAuditOptions++;
-  if (buildCounterCloudAuditOptions < 3) {
-    o.logName = "foo";
-  }
-  buildCounterCloudAuditOptions--;
-  return o;
-}
-
-checkCloudAuditOptions(api.CloudAuditOptions o) {
-  buildCounterCloudAuditOptions++;
-  if (buildCounterCloudAuditOptions < 3) {
-    unittest.expect(o.logName, unittest.equals('foo'));
-  }
-  buildCounterCloudAuditOptions--;
-}
-
-buildUnnamed1153() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1153(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterCondition = 0;
-buildCondition() {
-  var o = new api.Condition();
-  buildCounterCondition++;
-  if (buildCounterCondition < 3) {
-    o.iam = "foo";
-    o.op = "foo";
-    o.svc = "foo";
-    o.sys = "foo";
-    o.value = "foo";
-    o.values = buildUnnamed1153();
-  }
-  buildCounterCondition--;
-  return o;
-}
-
-checkCondition(api.Condition o) {
-  buildCounterCondition++;
-  if (buildCounterCondition < 3) {
-    unittest.expect(o.iam, unittest.equals('foo'));
-    unittest.expect(o.op, unittest.equals('foo'));
-    unittest.expect(o.svc, unittest.equals('foo'));
-    unittest.expect(o.sys, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed1153(o.values);
-  }
-  buildCounterCondition--;
-}
-
-buildUnnamed1154() {
+buildUnnamed1156() {
   var o = new core.List<api.Advice>();
   o.add(buildAdvice());
   o.add(buildAdvice());
   return o;
 }
 
-checkUnnamed1154(core.List<api.Advice> o) {
+checkUnnamed1156(core.List<api.Advice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdvice(o[0]);
   checkAdvice(o[1]);
@@ -581,7 +519,7 @@
   var o = new api.ConfigChange();
   buildCounterConfigChange++;
   if (buildCounterConfigChange < 3) {
-    o.advices = buildUnnamed1154();
+    o.advices = buildUnnamed1156();
     o.changeType = "foo";
     o.element = "foo";
     o.newValue = "foo";
@@ -594,7 +532,7 @@
 checkConfigChange(api.ConfigChange o) {
   buildCounterConfigChange++;
   if (buildCounterConfigChange < 3) {
-    checkUnnamed1154(o.advices);
+    checkUnnamed1156(o.advices);
     unittest.expect(o.changeType, unittest.equals('foo'));
     unittest.expect(o.element, unittest.equals('foo'));
     unittest.expect(o.newValue, unittest.equals('foo'));
@@ -645,14 +583,14 @@
   buildCounterConfigRef--;
 }
 
-buildUnnamed1155() {
+buildUnnamed1157() {
   var o = new core.List<api.ConfigFile>();
   o.add(buildConfigFile());
   o.add(buildConfigFile());
   return o;
 }
 
-checkUnnamed1155(core.List<api.ConfigFile> o) {
+checkUnnamed1157(core.List<api.ConfigFile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConfigFile(o[0]);
   checkConfigFile(o[1]);
@@ -663,7 +601,7 @@
   var o = new api.ConfigSource();
   buildCounterConfigSource++;
   if (buildCounterConfigSource < 3) {
-    o.files = buildUnnamed1155();
+    o.files = buildUnnamed1157();
     o.id = "foo";
   }
   buildCounterConfigSource--;
@@ -673,20 +611,20 @@
 checkConfigSource(api.ConfigSource o) {
   buildCounterConfigSource++;
   if (buildCounterConfigSource < 3) {
-    checkUnnamed1155(o.files);
+    checkUnnamed1157(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
   }
   buildCounterConfigSource--;
 }
 
-buildUnnamed1156() {
+buildUnnamed1158() {
   var o = new core.List<api.ContextRule>();
   o.add(buildContextRule());
   o.add(buildContextRule());
   return o;
 }
 
-checkUnnamed1156(core.List<api.ContextRule> o) {
+checkUnnamed1158(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextRule(o[0]);
   checkContextRule(o[1]);
@@ -697,7 +635,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.rules = buildUnnamed1156();
+    o.rules = buildUnnamed1158();
   }
   buildCounterContext--;
   return o;
@@ -706,32 +644,32 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed1156(o.rules);
+    checkUnnamed1158(o.rules);
   }
   buildCounterContext--;
 }
 
-buildUnnamed1157() {
+buildUnnamed1159() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1157(core.List<core.String> o) {
+checkUnnamed1159(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1158() {
+buildUnnamed1160() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1158(core.List<core.String> o) {
+checkUnnamed1160(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -742,8 +680,8 @@
   var o = new api.ContextRule();
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    o.provided = buildUnnamed1157();
-    o.requested = buildUnnamed1158();
+    o.provided = buildUnnamed1159();
+    o.requested = buildUnnamed1160();
     o.selector = "foo";
   }
   buildCounterContextRule--;
@@ -753,8 +691,8 @@
 checkContextRule(api.ContextRule o) {
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    checkUnnamed1157(o.provided);
-    checkUnnamed1158(o.requested);
+    checkUnnamed1159(o.provided);
+    checkUnnamed1160(o.requested);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterContextRule--;
@@ -779,27 +717,6 @@
   buildCounterControl--;
 }
 
-core.int buildCounterCounterOptions = 0;
-buildCounterOptions() {
-  var o = new api.CounterOptions();
-  buildCounterCounterOptions++;
-  if (buildCounterCounterOptions < 3) {
-    o.field = "foo";
-    o.metric = "foo";
-  }
-  buildCounterCounterOptions--;
-  return o;
-}
-
-checkCounterOptions(api.CounterOptions o) {
-  buildCounterCounterOptions++;
-  if (buildCounterCounterOptions < 3) {
-    unittest.expect(o.field, unittest.equals('foo'));
-    unittest.expect(o.metric, unittest.equals('foo'));
-  }
-  buildCounterCounterOptions--;
-}
-
 core.int buildCounterCustomAuthRequirements = 0;
 buildCustomAuthRequirements() {
   var o = new api.CustomAuthRequirements();
@@ -819,27 +736,27 @@
   buildCounterCustomAuthRequirements--;
 }
 
-buildUnnamed1159() {
+buildUnnamed1161() {
   var o = new core.List<api.CustomErrorRule>();
   o.add(buildCustomErrorRule());
   o.add(buildCustomErrorRule());
   return o;
 }
 
-checkUnnamed1159(core.List<api.CustomErrorRule> o) {
+checkUnnamed1161(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomErrorRule(o[0]);
   checkCustomErrorRule(o[1]);
 }
 
-buildUnnamed1160() {
+buildUnnamed1162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1160(core.List<core.String> o) {
+checkUnnamed1162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -850,8 +767,8 @@
   var o = new api.CustomError();
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    o.rules = buildUnnamed1159();
-    o.types = buildUnnamed1160();
+    o.rules = buildUnnamed1161();
+    o.types = buildUnnamed1162();
   }
   buildCounterCustomError--;
   return o;
@@ -860,8 +777,8 @@
 checkCustomError(api.CustomError o) {
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    checkUnnamed1159(o.rules);
-    checkUnnamed1160(o.types);
+    checkUnnamed1161(o.rules);
+    checkUnnamed1162(o.types);
   }
   buildCounterCustomError--;
 }
@@ -908,39 +825,18 @@
   buildCounterCustomHttpPattern--;
 }
 
-core.int buildCounterDataAccessOptions = 0;
-buildDataAccessOptions() {
-  var o = new api.DataAccessOptions();
-  buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-    o.logMode = "foo";
-  }
-  buildCounterDataAccessOptions--;
-  return o;
-}
-
-checkDataAccessOptions(api.DataAccessOptions o) {
-  buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-    unittest.expect(o.logMode, unittest.equals('foo'));
-  }
-  buildCounterDataAccessOptions--;
-}
-
 core.int buildCounterDeleteServiceStrategy = 0;
 buildDeleteServiceStrategy() {
   var o = new api.DeleteServiceStrategy();
   buildCounterDeleteServiceStrategy++;
-  if (buildCounterDeleteServiceStrategy < 3) {
-  }
+  if (buildCounterDeleteServiceStrategy < 3) {}
   buildCounterDeleteServiceStrategy--;
   return o;
 }
 
 checkDeleteServiceStrategy(api.DeleteServiceStrategy o) {
   buildCounterDeleteServiceStrategy++;
-  if (buildCounterDeleteServiceStrategy < 3) {
-  }
+  if (buildCounterDeleteServiceStrategy < 3) {}
   buildCounterDeleteServiceStrategy--;
 }
 
@@ -986,27 +882,27 @@
   buildCounterDisableServiceRequest--;
 }
 
-buildUnnamed1161() {
+buildUnnamed1163() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1161(core.List<api.Page> o) {
+checkUnnamed1163(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed1162() {
+buildUnnamed1164() {
   var o = new core.List<api.DocumentationRule>();
   o.add(buildDocumentationRule());
   o.add(buildDocumentationRule());
   return o;
 }
 
-checkUnnamed1162(core.List<api.DocumentationRule> o) {
+checkUnnamed1164(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDocumentationRule(o[0]);
   checkDocumentationRule(o[1]);
@@ -1019,8 +915,8 @@
   if (buildCounterDocumentation < 3) {
     o.documentationRootUrl = "foo";
     o.overview = "foo";
-    o.pages = buildUnnamed1161();
-    o.rules = buildUnnamed1162();
+    o.pages = buildUnnamed1163();
+    o.rules = buildUnnamed1164();
     o.summary = "foo";
   }
   buildCounterDocumentation--;
@@ -1032,8 +928,8 @@
   if (buildCounterDocumentation < 3) {
     unittest.expect(o.documentationRootUrl, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
-    checkUnnamed1161(o.pages);
-    checkUnnamed1162(o.rules);
+    checkUnnamed1163(o.pages);
+    checkUnnamed1164(o.rules);
     unittest.expect(o.summary, unittest.equals('foo'));
   }
   buildCounterDocumentation--;
@@ -1081,32 +977,6 @@
   buildCounterEnableServiceRequest--;
 }
 
-buildUnnamed1163() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1163(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1164() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1164(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed1165() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1120,15 +990,41 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1166() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1166(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1167() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1167(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 core.int buildCounterEndpoint = 0;
 buildEndpoint() {
   var o = new api.Endpoint();
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    o.aliases = buildUnnamed1163();
+    o.aliases = buildUnnamed1165();
     o.allowCors = true;
-    o.apis = buildUnnamed1164();
-    o.features = buildUnnamed1165();
+    o.apis = buildUnnamed1166();
+    o.features = buildUnnamed1167();
     o.name = "foo";
     o.target = "foo";
   }
@@ -1139,37 +1035,37 @@
 checkEndpoint(api.Endpoint o) {
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    checkUnnamed1163(o.aliases);
+    checkUnnamed1165(o.aliases);
     unittest.expect(o.allowCors, unittest.isTrue);
-    checkUnnamed1164(o.apis);
-    checkUnnamed1165(o.features);
+    checkUnnamed1166(o.apis);
+    checkUnnamed1167(o.features);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
   }
   buildCounterEndpoint--;
 }
 
-buildUnnamed1166() {
+buildUnnamed1168() {
   var o = new core.List<api.EnumValue>();
   o.add(buildEnumValue());
   o.add(buildEnumValue());
   return o;
 }
 
-checkUnnamed1166(core.List<api.EnumValue> o) {
+checkUnnamed1168(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnumValue(o[0]);
   checkEnumValue(o[1]);
 }
 
-buildUnnamed1167() {
+buildUnnamed1169() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1167(core.List<api.Option> o) {
+checkUnnamed1169(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1180,9 +1076,9 @@
   var o = new api.Enum();
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    o.enumvalue = buildUnnamed1166();
+    o.enumvalue = buildUnnamed1168();
     o.name = "foo";
-    o.options = buildUnnamed1167();
+    o.options = buildUnnamed1169();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -1193,23 +1089,23 @@
 checkEnum(api.Enum o) {
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    checkUnnamed1166(o.enumvalue);
+    checkUnnamed1168(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1167(o.options);
+    checkUnnamed1169(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
 }
 
-buildUnnamed1168() {
+buildUnnamed1170() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1168(core.List<api.Option> o) {
+checkUnnamed1170(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1222,7 +1118,7 @@
   if (buildCounterEnumValue < 3) {
     o.name = "foo";
     o.number = 42;
-    o.options = buildUnnamed1168();
+    o.options = buildUnnamed1170();
   }
   buildCounterEnumValue--;
   return o;
@@ -1233,7 +1129,7 @@
   if (buildCounterEnumValue < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
-    checkUnnamed1168(o.options);
+    checkUnnamed1170(o.options);
   }
   buildCounterEnumValue--;
 }
@@ -1282,14 +1178,14 @@
   buildCounterExpr--;
 }
 
-buildUnnamed1169() {
+buildUnnamed1171() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1169(core.List<api.Option> o) {
+checkUnnamed1171(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1307,7 +1203,7 @@
     o.name = "foo";
     o.number = 42;
     o.oneofIndex = 42;
-    o.options = buildUnnamed1169();
+    o.options = buildUnnamed1171();
     o.packed = true;
     o.typeUrl = "foo";
   }
@@ -1325,21 +1221,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.oneofIndex, unittest.equals(42));
-    checkUnnamed1169(o.options);
+    checkUnnamed1171(o.options);
     unittest.expect(o.packed, unittest.isTrue);
     unittest.expect(o.typeUrl, unittest.equals('foo'));
   }
   buildCounterField--;
 }
 
-buildUnnamed1170() {
+buildUnnamed1172() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1170(core.List<core.String> o) {
+checkUnnamed1172(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1353,7 +1249,7 @@
     o.cancelState = "foo";
     o.deadline = "foo";
     o.flowName = "foo";
-    o.resourceNames = buildUnnamed1170();
+    o.resourceNames = buildUnnamed1172();
     o.startTime = "foo";
   }
   buildCounterFlowOperationMetadata--;
@@ -1366,36 +1262,68 @@
     unittest.expect(o.cancelState, unittest.equals('foo'));
     unittest.expect(o.deadline, unittest.equals('foo'));
     unittest.expect(o.flowName, unittest.equals('foo'));
-    checkUnnamed1170(o.resourceNames);
+    checkUnnamed1172(o.resourceNames);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterFlowOperationMetadata--;
 }
 
-buildUnnamed1171() {
+buildUnnamed1173() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1171(core.Map<core.String, core.Object> o) {
+checkUnnamed1173(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1172() {
+buildUnnamed1174() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1172(core.Map<core.String, core.Object> o) {
+checkUnnamed1174(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterGenerateConfigReportRequest = 0;
@@ -1403,8 +1331,8 @@
   var o = new api.GenerateConfigReportRequest();
   buildCounterGenerateConfigReportRequest++;
   if (buildCounterGenerateConfigReportRequest < 3) {
-    o.newConfig = buildUnnamed1171();
-    o.oldConfig = buildUnnamed1172();
+    o.newConfig = buildUnnamed1173();
+    o.oldConfig = buildUnnamed1174();
   }
   buildCounterGenerateConfigReportRequest--;
   return o;
@@ -1413,33 +1341,33 @@
 checkGenerateConfigReportRequest(api.GenerateConfigReportRequest o) {
   buildCounterGenerateConfigReportRequest++;
   if (buildCounterGenerateConfigReportRequest < 3) {
-    checkUnnamed1171(o.newConfig);
-    checkUnnamed1172(o.oldConfig);
+    checkUnnamed1173(o.newConfig);
+    checkUnnamed1174(o.oldConfig);
   }
   buildCounterGenerateConfigReportRequest--;
 }
 
-buildUnnamed1173() {
+buildUnnamed1175() {
   var o = new core.List<api.ChangeReport>();
   o.add(buildChangeReport());
   o.add(buildChangeReport());
   return o;
 }
 
-checkUnnamed1173(core.List<api.ChangeReport> o) {
+checkUnnamed1175(core.List<api.ChangeReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChangeReport(o[0]);
   checkChangeReport(o[1]);
 }
 
-buildUnnamed1174() {
+buildUnnamed1176() {
   var o = new core.List<api.Diagnostic>();
   o.add(buildDiagnostic());
   o.add(buildDiagnostic());
   return o;
 }
 
-checkUnnamed1174(core.List<api.Diagnostic> o) {
+checkUnnamed1176(core.List<api.Diagnostic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiagnostic(o[0]);
   checkDiagnostic(o[1]);
@@ -1450,8 +1378,8 @@
   var o = new api.GenerateConfigReportResponse();
   buildCounterGenerateConfigReportResponse++;
   if (buildCounterGenerateConfigReportResponse < 3) {
-    o.changeReports = buildUnnamed1173();
-    o.diagnostics = buildUnnamed1174();
+    o.changeReports = buildUnnamed1175();
+    o.diagnostics = buildUnnamed1176();
     o.id = "foo";
     o.serviceName = "foo";
   }
@@ -1462,8 +1390,8 @@
 checkGenerateConfigReportResponse(api.GenerateConfigReportResponse o) {
   buildCounterGenerateConfigReportResponse++;
   if (buildCounterGenerateConfigReportResponse < 3) {
-    checkUnnamed1173(o.changeReports);
-    checkUnnamed1174(o.diagnostics);
+    checkUnnamed1175(o.changeReports);
+    checkUnnamed1176(o.diagnostics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.serviceName, unittest.equals('foo'));
   }
@@ -1474,27 +1402,25 @@
 buildGetIamPolicyRequest() {
   var o = new api.GetIamPolicyRequest();
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
   return o;
 }
 
 checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed1175() {
+buildUnnamed1177() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1175(core.List<api.HttpRule> o) {
+checkUnnamed1177(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -1506,7 +1432,7 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     o.fullyDecodeReservedExpansion = true;
-    o.rules = buildUnnamed1175();
+    o.rules = buildUnnamed1177();
   }
   buildCounterHttp--;
   return o;
@@ -1516,19 +1442,19 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     unittest.expect(o.fullyDecodeReservedExpansion, unittest.isTrue);
-    checkUnnamed1175(o.rules);
+    checkUnnamed1177(o.rules);
   }
   buildCounterHttp--;
 }
 
-buildUnnamed1176() {
+buildUnnamed1178() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1176(core.List<api.HttpRule> o) {
+checkUnnamed1178(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -1539,7 +1465,7 @@
   var o = new api.HttpRule();
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    o.additionalBindings = buildUnnamed1176();
+    o.additionalBindings = buildUnnamed1178();
     o.body = "foo";
     o.custom = buildCustomHttpPattern();
     o.delete = "foo";
@@ -1559,7 +1485,7 @@
 checkHttpRule(api.HttpRule o) {
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    checkUnnamed1176(o.additionalBindings);
+    checkUnnamed1178(o.additionalBindings);
     unittest.expect(o.body, unittest.equals('foo'));
     checkCustomHttpPattern(o.custom);
     unittest.expect(o.delete, unittest.equals('foo'));
@@ -1598,14 +1524,14 @@
   buildCounterLabelDescriptor--;
 }
 
-buildUnnamed1177() {
+buildUnnamed1179() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1177(core.List<api.Operation> o) {
+checkUnnamed1179(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1617,7 +1543,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1177();
+    o.operations = buildUnnamed1179();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1627,19 +1553,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1177(o.operations);
+    checkUnnamed1179(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1178() {
+buildUnnamed1180() {
   var o = new core.List<api.Service>();
   o.add(buildService());
   o.add(buildService());
   return o;
 }
 
-checkUnnamed1178(core.List<api.Service> o) {
+checkUnnamed1180(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkService(o[0]);
   checkService(o[1]);
@@ -1651,7 +1577,7 @@
   buildCounterListServiceConfigsResponse++;
   if (buildCounterListServiceConfigsResponse < 3) {
     o.nextPageToken = "foo";
-    o.serviceConfigs = buildUnnamed1178();
+    o.serviceConfigs = buildUnnamed1180();
   }
   buildCounterListServiceConfigsResponse--;
   return o;
@@ -1661,19 +1587,19 @@
   buildCounterListServiceConfigsResponse++;
   if (buildCounterListServiceConfigsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1178(o.serviceConfigs);
+    checkUnnamed1180(o.serviceConfigs);
   }
   buildCounterListServiceConfigsResponse--;
 }
 
-buildUnnamed1179() {
+buildUnnamed1181() {
   var o = new core.List<api.Rollout>();
   o.add(buildRollout());
   o.add(buildRollout());
   return o;
 }
 
-checkUnnamed1179(core.List<api.Rollout> o) {
+checkUnnamed1181(core.List<api.Rollout> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRollout(o[0]);
   checkRollout(o[1]);
@@ -1685,7 +1611,7 @@
   buildCounterListServiceRolloutsResponse++;
   if (buildCounterListServiceRolloutsResponse < 3) {
     o.nextPageToken = "foo";
-    o.rollouts = buildUnnamed1179();
+    o.rollouts = buildUnnamed1181();
   }
   buildCounterListServiceRolloutsResponse--;
   return o;
@@ -1695,19 +1621,19 @@
   buildCounterListServiceRolloutsResponse++;
   if (buildCounterListServiceRolloutsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1179(o.rollouts);
+    checkUnnamed1181(o.rollouts);
   }
   buildCounterListServiceRolloutsResponse--;
 }
 
-buildUnnamed1180() {
+buildUnnamed1182() {
   var o = new core.List<api.ManagedService>();
   o.add(buildManagedService());
   o.add(buildManagedService());
   return o;
 }
 
-checkUnnamed1180(core.List<api.ManagedService> o) {
+checkUnnamed1182(core.List<api.ManagedService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedService(o[0]);
   checkManagedService(o[1]);
@@ -1719,7 +1645,7 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed1180();
+    o.services = buildUnnamed1182();
   }
   buildCounterListServicesResponse--;
   return o;
@@ -1729,42 +1655,19 @@
   buildCounterListServicesResponse++;
   if (buildCounterListServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1180(o.services);
+    checkUnnamed1182(o.services);
   }
   buildCounterListServicesResponse--;
 }
 
-core.int buildCounterLogConfig = 0;
-buildLogConfig() {
-  var o = new api.LogConfig();
-  buildCounterLogConfig++;
-  if (buildCounterLogConfig < 3) {
-    o.cloudAudit = buildCloudAuditOptions();
-    o.counter = buildCounterOptions();
-    o.dataAccess = buildDataAccessOptions();
-  }
-  buildCounterLogConfig--;
-  return o;
-}
-
-checkLogConfig(api.LogConfig o) {
-  buildCounterLogConfig++;
-  if (buildCounterLogConfig < 3) {
-    checkCloudAuditOptions(o.cloudAudit);
-    checkCounterOptions(o.counter);
-    checkDataAccessOptions(o.dataAccess);
-  }
-  buildCounterLogConfig--;
-}
-
-buildUnnamed1181() {
+buildUnnamed1183() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1181(core.List<api.LabelDescriptor> o) {
+checkUnnamed1183(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1777,7 +1680,7 @@
   if (buildCounterLogDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1181();
+    o.labels = buildUnnamed1183();
     o.name = "foo";
   }
   buildCounterLogDescriptor--;
@@ -1789,33 +1692,33 @@
   if (buildCounterLogDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1181(o.labels);
+    checkUnnamed1183(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLogDescriptor--;
 }
 
-buildUnnamed1182() {
+buildUnnamed1184() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1182(core.List<api.LoggingDestination> o) {
+checkUnnamed1184(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
 }
 
-buildUnnamed1183() {
+buildUnnamed1185() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1183(core.List<api.LoggingDestination> o) {
+checkUnnamed1185(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
@@ -1826,8 +1729,8 @@
   var o = new api.Logging();
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    o.consumerDestinations = buildUnnamed1182();
-    o.producerDestinations = buildUnnamed1183();
+    o.consumerDestinations = buildUnnamed1184();
+    o.producerDestinations = buildUnnamed1185();
   }
   buildCounterLogging--;
   return o;
@@ -1836,20 +1739,20 @@
 checkLogging(api.Logging o) {
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    checkUnnamed1182(o.consumerDestinations);
-    checkUnnamed1183(o.producerDestinations);
+    checkUnnamed1184(o.consumerDestinations);
+    checkUnnamed1185(o.producerDestinations);
   }
   buildCounterLogging--;
 }
 
-buildUnnamed1184() {
+buildUnnamed1186() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1184(core.List<core.String> o) {
+checkUnnamed1186(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1860,7 +1763,7 @@
   var o = new api.LoggingDestination();
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    o.logs = buildUnnamed1184();
+    o.logs = buildUnnamed1186();
     o.monitoredResource = "foo";
   }
   buildCounterLoggingDestination--;
@@ -1870,7 +1773,7 @@
 checkLoggingDestination(api.LoggingDestination o) {
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    checkUnnamed1184(o.logs);
+    checkUnnamed1186(o.logs);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterLoggingDestination--;
@@ -1926,14 +1829,14 @@
   buildCounterMediaDownload--;
 }
 
-buildUnnamed1185() {
+buildUnnamed1187() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1185(core.List<core.String> o) {
+checkUnnamed1187(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1948,7 +1851,7 @@
     o.dropzone = "foo";
     o.enabled = true;
     o.maxSize = "foo";
-    o.mimeTypes = buildUnnamed1185();
+    o.mimeTypes = buildUnnamed1187();
     o.progressNotification = true;
     o.startNotification = true;
     o.uploadService = "foo";
@@ -1964,7 +1867,7 @@
     unittest.expect(o.dropzone, unittest.equals('foo'));
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.maxSize, unittest.equals('foo'));
-    checkUnnamed1185(o.mimeTypes);
+    checkUnnamed1187(o.mimeTypes);
     unittest.expect(o.progressNotification, unittest.isTrue);
     unittest.expect(o.startNotification, unittest.isTrue);
     unittest.expect(o.uploadService, unittest.equals('foo'));
@@ -1972,14 +1875,14 @@
   buildCounterMediaUpload--;
 }
 
-buildUnnamed1186() {
+buildUnnamed1188() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1186(core.List<api.Option> o) {
+checkUnnamed1188(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1991,7 +1894,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     o.name = "foo";
-    o.options = buildUnnamed1186();
+    o.options = buildUnnamed1188();
     o.requestStreaming = true;
     o.requestTypeUrl = "foo";
     o.responseStreaming = true;
@@ -2006,7 +1909,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1186(o.options);
+    checkUnnamed1188(o.options);
     unittest.expect(o.requestStreaming, unittest.isTrue);
     unittest.expect(o.requestTypeUrl, unittest.equals('foo'));
     unittest.expect(o.responseStreaming, unittest.isTrue);
@@ -2016,14 +1919,14 @@
   buildCounterMethod--;
 }
 
-buildUnnamed1187() {
+buildUnnamed1189() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1187(core.List<api.LabelDescriptor> o) {
+checkUnnamed1189(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -2036,7 +1939,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1187();
+    o.labels = buildUnnamed1189();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -2052,7 +1955,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1187(o.labels);
+    checkUnnamed1189(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -2062,14 +1965,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed1188() {
+buildUnnamed1190() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1188(core.Map<core.String, core.String> o) {
+checkUnnamed1190(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2080,7 +1983,7 @@
   var o = new api.MetricRule();
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    o.metricCosts = buildUnnamed1188();
+    o.metricCosts = buildUnnamed1190();
     o.selector = "foo";
   }
   buildCounterMetricRule--;
@@ -2090,7 +1993,7 @@
 checkMetricRule(api.MetricRule o) {
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    checkUnnamed1188(o.metricCosts);
+    checkUnnamed1190(o.metricCosts);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterMetricRule--;
@@ -2117,14 +2020,14 @@
   buildCounterMixin--;
 }
 
-buildUnnamed1189() {
+buildUnnamed1191() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1189(core.List<api.LabelDescriptor> o) {
+checkUnnamed1191(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -2137,7 +2040,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1189();
+    o.labels = buildUnnamed1191();
     o.name = "foo";
     o.type = "foo";
   }
@@ -2150,34 +2053,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1189(o.labels);
+    checkUnnamed1191(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed1190() {
+buildUnnamed1192() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1190(core.List<api.MonitoringDestination> o) {
+checkUnnamed1192(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
 }
 
-buildUnnamed1191() {
+buildUnnamed1193() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1191(core.List<api.MonitoringDestination> o) {
+checkUnnamed1193(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
@@ -2188,8 +2091,8 @@
   var o = new api.Monitoring();
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    o.consumerDestinations = buildUnnamed1190();
-    o.producerDestinations = buildUnnamed1191();
+    o.consumerDestinations = buildUnnamed1192();
+    o.producerDestinations = buildUnnamed1193();
   }
   buildCounterMonitoring--;
   return o;
@@ -2198,20 +2101,20 @@
 checkMonitoring(api.Monitoring o) {
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    checkUnnamed1190(o.consumerDestinations);
-    checkUnnamed1191(o.producerDestinations);
+    checkUnnamed1192(o.consumerDestinations);
+    checkUnnamed1193(o.producerDestinations);
   }
   buildCounterMonitoring--;
 }
 
-buildUnnamed1192() {
+buildUnnamed1194() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1192(core.List<core.String> o) {
+checkUnnamed1194(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2222,7 +2125,7 @@
   var o = new api.MonitoringDestination();
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    o.metrics = buildUnnamed1192();
+    o.metrics = buildUnnamed1194();
     o.monitoredResource = "foo";
   }
   buildCounterMonitoringDestination--;
@@ -2232,7 +2135,7 @@
 checkMonitoringDestination(api.MonitoringDestination o) {
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    checkUnnamed1192(o.metrics);
+    checkUnnamed1194(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterMonitoringDestination--;
@@ -2257,30 +2160,62 @@
   buildCounterOAuthRequirements--;
 }
 
-buildUnnamed1193() {
+buildUnnamed1195() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1193(core.Map<core.String, core.Object> o) {
+checkUnnamed1195(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1194() {
+buildUnnamed1196() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1194(core.Map<core.String, core.Object> o) {
+checkUnnamed1196(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -2290,9 +2225,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1193();
+    o.metadata = buildUnnamed1195();
     o.name = "foo";
-    o.response = buildUnnamed1194();
+    o.response = buildUnnamed1196();
   }
   buildCounterOperation--;
   return o;
@@ -2303,34 +2238,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1193(o.metadata);
+    checkUnnamed1195(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1194(o.response);
+    checkUnnamed1196(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1195() {
+buildUnnamed1197() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1195(core.List<core.String> o) {
+checkUnnamed1197(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1196() {
+buildUnnamed1198() {
   var o = new core.List<api.Step>();
   o.add(buildStep());
   o.add(buildStep());
   return o;
 }
 
-checkUnnamed1196(core.List<api.Step> o) {
+checkUnnamed1198(core.List<api.Step> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStep(o[0]);
   checkStep(o[1]);
@@ -2342,9 +2277,9 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     o.progressPercentage = 42;
-    o.resourceNames = buildUnnamed1195();
+    o.resourceNames = buildUnnamed1197();
     o.startTime = "foo";
-    o.steps = buildUnnamed1196();
+    o.steps = buildUnnamed1198();
   }
   buildCounterOperationMetadata--;
   return o;
@@ -2354,24 +2289,40 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     unittest.expect(o.progressPercentage, unittest.equals(42));
-    checkUnnamed1195(o.resourceNames);
+    checkUnnamed1197(o.resourceNames);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkUnnamed1196(o.steps);
+    checkUnnamed1198(o.steps);
   }
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed1197() {
+buildUnnamed1199() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1197(core.Map<core.String, core.Object> o) {
+checkUnnamed1199(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o["x"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o["y"]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+  var casted9 = (o["x"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o["y"]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOption = 0;
@@ -2380,7 +2331,7 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     o.name = "foo";
-    o.value = buildUnnamed1197();
+    o.value = buildUnnamed1199();
   }
   buildCounterOption--;
   return o;
@@ -2390,19 +2341,19 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1197(o.value);
+    checkUnnamed1199(o.value);
   }
   buildCounterOption--;
 }
 
-buildUnnamed1198() {
+buildUnnamed1200() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1198(core.List<api.Page> o) {
+checkUnnamed1200(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -2415,7 +2366,7 @@
   if (buildCounterPage < 3) {
     o.content = "foo";
     o.name = "foo";
-    o.subpages = buildUnnamed1198();
+    o.subpages = buildUnnamed1200();
   }
   buildCounterPage--;
   return o;
@@ -2426,60 +2377,46 @@
   if (buildCounterPage < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1198(o.subpages);
+    checkUnnamed1200(o.subpages);
   }
   buildCounterPage--;
 }
 
-buildUnnamed1199() {
+buildUnnamed1201() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed1199(core.List<api.AuditConfig> o) {
+checkUnnamed1201(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed1200() {
+buildUnnamed1202() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed1200(core.List<api.Binding> o) {
+checkUnnamed1202(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
 }
 
-buildUnnamed1201() {
-  var o = new core.List<api.Rule>();
-  o.add(buildRule());
-  o.add(buildRule());
-  return o;
-}
-
-checkUnnamed1201(core.List<api.Rule> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
-}
-
 core.int buildCounterPolicy = 0;
 buildPolicy() {
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed1199();
-    o.bindings = buildUnnamed1200();
+    o.auditConfigs = buildUnnamed1201();
+    o.bindings = buildUnnamed1202();
     o.etag = "foo";
     o.iamOwned = true;
-    o.rules = buildUnnamed1201();
     o.version = 42;
   }
   buildCounterPolicy--;
@@ -2489,37 +2426,36 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed1199(o.auditConfigs);
-    checkUnnamed1200(o.bindings);
+    checkUnnamed1201(o.auditConfigs);
+    checkUnnamed1202(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed1201(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed1202() {
+buildUnnamed1203() {
   var o = new core.List<api.QuotaLimit>();
   o.add(buildQuotaLimit());
   o.add(buildQuotaLimit());
   return o;
 }
 
-checkUnnamed1202(core.List<api.QuotaLimit> o) {
+checkUnnamed1203(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaLimit(o[0]);
   checkQuotaLimit(o[1]);
 }
 
-buildUnnamed1203() {
+buildUnnamed1204() {
   var o = new core.List<api.MetricRule>();
   o.add(buildMetricRule());
   o.add(buildMetricRule());
   return o;
 }
 
-checkUnnamed1203(core.List<api.MetricRule> o) {
+checkUnnamed1204(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricRule(o[0]);
   checkMetricRule(o[1]);
@@ -2530,8 +2466,8 @@
   var o = new api.Quota();
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    o.limits = buildUnnamed1202();
-    o.metricRules = buildUnnamed1203();
+    o.limits = buildUnnamed1203();
+    o.metricRules = buildUnnamed1204();
   }
   buildCounterQuota--;
   return o;
@@ -2540,20 +2476,20 @@
 checkQuota(api.Quota o) {
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    checkUnnamed1202(o.limits);
-    checkUnnamed1203(o.metricRules);
+    checkUnnamed1203(o.limits);
+    checkUnnamed1204(o.metricRules);
   }
   buildCounterQuota--;
 }
 
-buildUnnamed1204() {
+buildUnnamed1205() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1204(core.Map<core.String, core.String> o) {
+checkUnnamed1205(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2573,7 +2509,7 @@
     o.metric = "foo";
     o.name = "foo";
     o.unit = "foo";
-    o.values = buildUnnamed1204();
+    o.values = buildUnnamed1205();
   }
   buildCounterQuotaLimit--;
   return o;
@@ -2591,7 +2527,7 @@
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
-    checkUnnamed1204(o.values);
+    checkUnnamed1205(o.values);
   }
   buildCounterQuotaLimit--;
 }
@@ -2627,201 +2563,105 @@
   buildCounterRollout--;
 }
 
-buildUnnamed1205() {
-  var o = new core.List<api.Condition>();
-  o.add(buildCondition());
-  o.add(buildCondition());
-  return o;
-}
-
-checkUnnamed1205(core.List<api.Condition> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
-}
-
 buildUnnamed1206() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1206(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1207() {
-  var o = new core.List<api.LogConfig>();
-  o.add(buildLogConfig());
-  o.add(buildLogConfig());
-  return o;
-}
-
-checkUnnamed1207(core.List<api.LogConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkLogConfig(o[0]);
-  checkLogConfig(o[1]);
-}
-
-buildUnnamed1208() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1208(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1209() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1209(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterRule = 0;
-buildRule() {
-  var o = new api.Rule();
-  buildCounterRule++;
-  if (buildCounterRule < 3) {
-    o.action = "foo";
-    o.conditions = buildUnnamed1205();
-    o.description = "foo";
-    o.in_ = buildUnnamed1206();
-    o.logConfig = buildUnnamed1207();
-    o.notIn = buildUnnamed1208();
-    o.permissions = buildUnnamed1209();
-  }
-  buildCounterRule--;
-  return o;
-}
-
-checkRule(api.Rule o) {
-  buildCounterRule++;
-  if (buildCounterRule < 3) {
-    unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed1205(o.conditions);
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1206(o.in_);
-    checkUnnamed1207(o.logConfig);
-    checkUnnamed1208(o.notIn);
-    checkUnnamed1209(o.permissions);
-  }
-  buildCounterRule--;
-}
-
-buildUnnamed1210() {
   var o = new core.List<api.Api>();
   o.add(buildApi());
   o.add(buildApi());
   return o;
 }
 
-checkUnnamed1210(core.List<api.Api> o) {
+checkUnnamed1206(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApi(o[0]);
   checkApi(o[1]);
 }
 
-buildUnnamed1211() {
+buildUnnamed1207() {
   var o = new core.List<api.Endpoint>();
   o.add(buildEndpoint());
   o.add(buildEndpoint());
   return o;
 }
 
-checkUnnamed1211(core.List<api.Endpoint> o) {
+checkUnnamed1207(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEndpoint(o[0]);
   checkEndpoint(o[1]);
 }
 
-buildUnnamed1212() {
+buildUnnamed1208() {
   var o = new core.List<api.Enum>();
   o.add(buildEnum());
   o.add(buildEnum());
   return o;
 }
 
-checkUnnamed1212(core.List<api.Enum> o) {
+checkUnnamed1208(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnum(o[0]);
   checkEnum(o[1]);
 }
 
-buildUnnamed1213() {
+buildUnnamed1209() {
   var o = new core.List<api.LogDescriptor>();
   o.add(buildLogDescriptor());
   o.add(buildLogDescriptor());
   return o;
 }
 
-checkUnnamed1213(core.List<api.LogDescriptor> o) {
+checkUnnamed1209(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogDescriptor(o[0]);
   checkLogDescriptor(o[1]);
 }
 
-buildUnnamed1214() {
+buildUnnamed1210() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1214(core.List<api.MetricDescriptor> o) {
+checkUnnamed1210(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
 }
 
-buildUnnamed1215() {
+buildUnnamed1211() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed1215(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed1211(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
 }
 
-buildUnnamed1216() {
+buildUnnamed1212() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1216(core.List<api.Type> o) {
+checkUnnamed1212(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
 }
 
-buildUnnamed1217() {
+buildUnnamed1213() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1217(core.List<api.Type> o) {
+checkUnnamed1213(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -2832,7 +2672,7 @@
   var o = new api.Service();
   buildCounterService++;
   if (buildCounterService < 3) {
-    o.apis = buildUnnamed1210();
+    o.apis = buildUnnamed1206();
     o.authentication = buildAuthentication();
     o.backend = buildBackend();
     o.configVersion = 42;
@@ -2840,24 +2680,24 @@
     o.control = buildControl();
     o.customError = buildCustomError();
     o.documentation = buildDocumentation();
-    o.endpoints = buildUnnamed1211();
-    o.enums = buildUnnamed1212();
+    o.endpoints = buildUnnamed1207();
+    o.enums = buildUnnamed1208();
     o.experimental = buildExperimental();
     o.http = buildHttp();
     o.id = "foo";
     o.logging = buildLogging();
-    o.logs = buildUnnamed1213();
-    o.metrics = buildUnnamed1214();
-    o.monitoredResources = buildUnnamed1215();
+    o.logs = buildUnnamed1209();
+    o.metrics = buildUnnamed1210();
+    o.monitoredResources = buildUnnamed1211();
     o.monitoring = buildMonitoring();
     o.name = "foo";
     o.producerProjectId = "foo";
     o.quota = buildQuota();
     o.sourceInfo = buildSourceInfo();
     o.systemParameters = buildSystemParameters();
-    o.systemTypes = buildUnnamed1216();
+    o.systemTypes = buildUnnamed1212();
     o.title = "foo";
-    o.types = buildUnnamed1217();
+    o.types = buildUnnamed1213();
     o.usage = buildUsage();
     o.visibility = buildVisibility();
   }
@@ -2868,7 +2708,7 @@
 checkService(api.Service o) {
   buildCounterService++;
   if (buildCounterService < 3) {
-    checkUnnamed1210(o.apis);
+    checkUnnamed1206(o.apis);
     checkAuthentication(o.authentication);
     checkBackend(o.backend);
     unittest.expect(o.configVersion, unittest.equals(42));
@@ -2876,24 +2716,24 @@
     checkControl(o.control);
     checkCustomError(o.customError);
     checkDocumentation(o.documentation);
-    checkUnnamed1211(o.endpoints);
-    checkUnnamed1212(o.enums);
+    checkUnnamed1207(o.endpoints);
+    checkUnnamed1208(o.enums);
     checkExperimental(o.experimental);
     checkHttp(o.http);
     unittest.expect(o.id, unittest.equals('foo'));
     checkLogging(o.logging);
-    checkUnnamed1213(o.logs);
-    checkUnnamed1214(o.metrics);
-    checkUnnamed1215(o.monitoredResources);
+    checkUnnamed1209(o.logs);
+    checkUnnamed1210(o.metrics);
+    checkUnnamed1211(o.monitoredResources);
     checkMonitoring(o.monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
     checkQuota(o.quota);
     checkSourceInfo(o.sourceInfo);
     checkSystemParameters(o.systemParameters);
-    checkUnnamed1216(o.systemTypes);
+    checkUnnamed1212(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1217(o.types);
+    checkUnnamed1213(o.types);
     checkUsage(o.usage);
     checkVisibility(o.visibility);
   }
@@ -2940,30 +2780,46 @@
   buildCounterSourceContext--;
 }
 
-buildUnnamed1218() {
+buildUnnamed1214() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1218(core.Map<core.String, core.Object> o) {
+checkUnnamed1214(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted11 = (o["x"]) as core.Map; unittest.expect(casted11, unittest.hasLength(3)); unittest.expect(casted11["list"], unittest.equals([1, 2, 3])); unittest.expect(casted11["bool"], unittest.equals(true)); unittest.expect(casted11["string"], unittest.equals('foo')); 
-  var casted12 = (o["y"]) as core.Map; unittest.expect(casted12, unittest.hasLength(3)); unittest.expect(casted12["list"], unittest.equals([1, 2, 3])); unittest.expect(casted12["bool"], unittest.equals(true)); unittest.expect(casted12["string"], unittest.equals('foo')); 
+  var casted11 = (o["x"]) as core.Map;
+  unittest.expect(casted11, unittest.hasLength(3));
+  unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted11["bool"], unittest.equals(true));
+  unittest.expect(casted11["string"], unittest.equals('foo'));
+  var casted12 = (o["y"]) as core.Map;
+  unittest.expect(casted12, unittest.hasLength(3));
+  unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted12["bool"], unittest.equals(true));
+  unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1219() {
+buildUnnamed1215() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1218());
-  o.add(buildUnnamed1218());
+  o.add(buildUnnamed1214());
+  o.add(buildUnnamed1214());
   return o;
 }
 
-checkUnnamed1219(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1215(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1218(o[0]);
-  checkUnnamed1218(o[1]);
+  checkUnnamed1214(o[0]);
+  checkUnnamed1214(o[1]);
 }
 
 core.int buildCounterSourceInfo = 0;
@@ -2971,7 +2827,7 @@
   var o = new api.SourceInfo();
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    o.sourceFiles = buildUnnamed1219();
+    o.sourceFiles = buildUnnamed1215();
   }
   buildCounterSourceInfo--;
   return o;
@@ -2980,35 +2836,51 @@
 checkSourceInfo(api.SourceInfo o) {
   buildCounterSourceInfo++;
   if (buildCounterSourceInfo < 3) {
-    checkUnnamed1219(o.sourceFiles);
+    checkUnnamed1215(o.sourceFiles);
   }
   buildCounterSourceInfo--;
 }
 
-buildUnnamed1220() {
+buildUnnamed1216() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1220(core.Map<core.String, core.Object> o) {
+checkUnnamed1216(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted13 = (o["x"]) as core.Map; unittest.expect(casted13, unittest.hasLength(3)); unittest.expect(casted13["list"], unittest.equals([1, 2, 3])); unittest.expect(casted13["bool"], unittest.equals(true)); unittest.expect(casted13["string"], unittest.equals('foo')); 
-  var casted14 = (o["y"]) as core.Map; unittest.expect(casted14, unittest.hasLength(3)); unittest.expect(casted14["list"], unittest.equals([1, 2, 3])); unittest.expect(casted14["bool"], unittest.equals(true)); unittest.expect(casted14["string"], unittest.equals('foo')); 
+  var casted13 = (o["x"]) as core.Map;
+  unittest.expect(casted13, unittest.hasLength(3));
+  unittest.expect(casted13["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted13["bool"], unittest.equals(true));
+  unittest.expect(casted13["string"], unittest.equals('foo'));
+  var casted14 = (o["y"]) as core.Map;
+  unittest.expect(casted14, unittest.hasLength(3));
+  unittest.expect(casted14["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted14["bool"], unittest.equals(true));
+  unittest.expect(casted14["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1221() {
+buildUnnamed1217() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1220());
-  o.add(buildUnnamed1220());
+  o.add(buildUnnamed1216());
+  o.add(buildUnnamed1216());
   return o;
 }
 
-checkUnnamed1221(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1217(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1220(o[0]);
-  checkUnnamed1220(o[1]);
+  checkUnnamed1216(o[0]);
+  checkUnnamed1216(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -3017,7 +2889,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1221();
+    o.details = buildUnnamed1217();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -3028,7 +2900,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1221(o.details);
+    checkUnnamed1217(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -3118,14 +2990,14 @@
   buildCounterSystemParameter--;
 }
 
-buildUnnamed1222() {
+buildUnnamed1218() {
   var o = new core.List<api.SystemParameter>();
   o.add(buildSystemParameter());
   o.add(buildSystemParameter());
   return o;
 }
 
-checkUnnamed1222(core.List<api.SystemParameter> o) {
+checkUnnamed1218(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameter(o[0]);
   checkSystemParameter(o[1]);
@@ -3136,7 +3008,7 @@
   var o = new api.SystemParameterRule();
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    o.parameters = buildUnnamed1222();
+    o.parameters = buildUnnamed1218();
     o.selector = "foo";
   }
   buildCounterSystemParameterRule--;
@@ -3146,20 +3018,20 @@
 checkSystemParameterRule(api.SystemParameterRule o) {
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    checkUnnamed1222(o.parameters);
+    checkUnnamed1218(o.parameters);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterSystemParameterRule--;
 }
 
-buildUnnamed1223() {
+buildUnnamed1219() {
   var o = new core.List<api.SystemParameterRule>();
   o.add(buildSystemParameterRule());
   o.add(buildSystemParameterRule());
   return o;
 }
 
-checkUnnamed1223(core.List<api.SystemParameterRule> o) {
+checkUnnamed1219(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameterRule(o[0]);
   checkSystemParameterRule(o[1]);
@@ -3170,7 +3042,7 @@
   var o = new api.SystemParameters();
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    o.rules = buildUnnamed1223();
+    o.rules = buildUnnamed1219();
   }
   buildCounterSystemParameters--;
   return o;
@@ -3179,11 +3051,120 @@
 checkSystemParameters(api.SystemParameters o) {
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    checkUnnamed1223(o.rules);
+    checkUnnamed1219(o.rules);
   }
   buildCounterSystemParameters--;
 }
 
+buildUnnamed1220() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1220(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterTestIamPermissionsRequest = 0;
+buildTestIamPermissionsRequest() {
+  var o = new api.TestIamPermissionsRequest();
+  buildCounterTestIamPermissionsRequest++;
+  if (buildCounterTestIamPermissionsRequest < 3) {
+    o.permissions = buildUnnamed1220();
+  }
+  buildCounterTestIamPermissionsRequest--;
+  return o;
+}
+
+checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
+  buildCounterTestIamPermissionsRequest++;
+  if (buildCounterTestIamPermissionsRequest < 3) {
+    checkUnnamed1220(o.permissions);
+  }
+  buildCounterTestIamPermissionsRequest--;
+}
+
+buildUnnamed1221() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1221(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterTestIamPermissionsResponse = 0;
+buildTestIamPermissionsResponse() {
+  var o = new api.TestIamPermissionsResponse();
+  buildCounterTestIamPermissionsResponse++;
+  if (buildCounterTestIamPermissionsResponse < 3) {
+    o.permissions = buildUnnamed1221();
+  }
+  buildCounterTestIamPermissionsResponse--;
+  return o;
+}
+
+checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
+  buildCounterTestIamPermissionsResponse++;
+  if (buildCounterTestIamPermissionsResponse < 3) {
+    checkUnnamed1221(o.permissions);
+  }
+  buildCounterTestIamPermissionsResponse--;
+}
+
+buildUnnamed1222() {
+  var o = new core.Map<core.String, core.double>();
+  o["x"] = 42.0;
+  o["y"] = 42.0;
+  return o;
+}
+
+checkUnnamed1222(core.Map<core.String, core.double> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o["x"], unittest.equals(42.0));
+  unittest.expect(o["y"], unittest.equals(42.0));
+}
+
+core.int buildCounterTrafficPercentStrategy = 0;
+buildTrafficPercentStrategy() {
+  var o = new api.TrafficPercentStrategy();
+  buildCounterTrafficPercentStrategy++;
+  if (buildCounterTrafficPercentStrategy < 3) {
+    o.percentages = buildUnnamed1222();
+  }
+  buildCounterTrafficPercentStrategy--;
+  return o;
+}
+
+checkTrafficPercentStrategy(api.TrafficPercentStrategy o) {
+  buildCounterTrafficPercentStrategy++;
+  if (buildCounterTrafficPercentStrategy < 3) {
+    checkUnnamed1222(o.percentages);
+  }
+  buildCounterTrafficPercentStrategy--;
+}
+
+buildUnnamed1223() {
+  var o = new core.List<api.Field>();
+  o.add(buildField());
+  o.add(buildField());
+  return o;
+}
+
+checkUnnamed1223(core.List<api.Field> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkField(o[0]);
+  checkField(o[1]);
+}
+
 buildUnnamed1224() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -3197,123 +3178,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterTestIamPermissionsRequest = 0;
-buildTestIamPermissionsRequest() {
-  var o = new api.TestIamPermissionsRequest();
-  buildCounterTestIamPermissionsRequest++;
-  if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed1224();
-  }
-  buildCounterTestIamPermissionsRequest--;
-  return o;
-}
-
-checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
-  buildCounterTestIamPermissionsRequest++;
-  if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed1224(o.permissions);
-  }
-  buildCounterTestIamPermissionsRequest--;
-}
-
 buildUnnamed1225() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1225(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterTestIamPermissionsResponse = 0;
-buildTestIamPermissionsResponse() {
-  var o = new api.TestIamPermissionsResponse();
-  buildCounterTestIamPermissionsResponse++;
-  if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed1225();
-  }
-  buildCounterTestIamPermissionsResponse--;
-  return o;
-}
-
-checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
-  buildCounterTestIamPermissionsResponse++;
-  if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed1225(o.permissions);
-  }
-  buildCounterTestIamPermissionsResponse--;
-}
-
-buildUnnamed1226() {
-  var o = new core.Map<core.String, core.double>();
-  o["x"] = 42.0;
-  o["y"] = 42.0;
-  return o;
-}
-
-checkUnnamed1226(core.Map<core.String, core.double> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o["x"], unittest.equals(42.0));
-  unittest.expect(o["y"], unittest.equals(42.0));
-}
-
-core.int buildCounterTrafficPercentStrategy = 0;
-buildTrafficPercentStrategy() {
-  var o = new api.TrafficPercentStrategy();
-  buildCounterTrafficPercentStrategy++;
-  if (buildCounterTrafficPercentStrategy < 3) {
-    o.percentages = buildUnnamed1226();
-  }
-  buildCounterTrafficPercentStrategy--;
-  return o;
-}
-
-checkTrafficPercentStrategy(api.TrafficPercentStrategy o) {
-  buildCounterTrafficPercentStrategy++;
-  if (buildCounterTrafficPercentStrategy < 3) {
-    checkUnnamed1226(o.percentages);
-  }
-  buildCounterTrafficPercentStrategy--;
-}
-
-buildUnnamed1227() {
-  var o = new core.List<api.Field>();
-  o.add(buildField());
-  o.add(buildField());
-  return o;
-}
-
-checkUnnamed1227(core.List<api.Field> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
-}
-
-buildUnnamed1228() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1228(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1229() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1229(core.List<api.Option> o) {
+checkUnnamed1225(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -3324,10 +3196,10 @@
   var o = new api.Type();
   buildCounterType++;
   if (buildCounterType < 3) {
-    o.fields = buildUnnamed1227();
+    o.fields = buildUnnamed1223();
     o.name = "foo";
-    o.oneofs = buildUnnamed1228();
-    o.options = buildUnnamed1229();
+    o.oneofs = buildUnnamed1224();
+    o.options = buildUnnamed1225();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -3338,10 +3210,10 @@
 checkType(api.Type o) {
   buildCounterType++;
   if (buildCounterType < 3) {
-    checkUnnamed1227(o.fields);
+    checkUnnamed1223(o.fields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1228(o.oneofs);
-    checkUnnamed1229(o.options);
+    checkUnnamed1224(o.oneofs);
+    checkUnnamed1225(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
@@ -3367,27 +3239,27 @@
   buildCounterUndeleteServiceResponse--;
 }
 
-buildUnnamed1230() {
+buildUnnamed1226() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1230(core.List<core.String> o) {
+checkUnnamed1226(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1231() {
+buildUnnamed1227() {
   var o = new core.List<api.UsageRule>();
   o.add(buildUsageRule());
   o.add(buildUsageRule());
   return o;
 }
 
-checkUnnamed1231(core.List<api.UsageRule> o) {
+checkUnnamed1227(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageRule(o[0]);
   checkUsageRule(o[1]);
@@ -3399,8 +3271,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     o.producerNotificationChannel = "foo";
-    o.requirements = buildUnnamed1230();
-    o.rules = buildUnnamed1231();
+    o.requirements = buildUnnamed1226();
+    o.rules = buildUnnamed1227();
   }
   buildCounterUsage--;
   return o;
@@ -3410,8 +3282,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
-    checkUnnamed1230(o.requirements);
-    checkUnnamed1231(o.rules);
+    checkUnnamed1226(o.requirements);
+    checkUnnamed1227(o.rules);
   }
   buildCounterUsage--;
 }
@@ -3439,14 +3311,14 @@
   buildCounterUsageRule--;
 }
 
-buildUnnamed1232() {
+buildUnnamed1228() {
   var o = new core.List<api.VisibilityRule>();
   o.add(buildVisibilityRule());
   o.add(buildVisibilityRule());
   return o;
 }
 
-checkUnnamed1232(core.List<api.VisibilityRule> o) {
+checkUnnamed1228(core.List<api.VisibilityRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVisibilityRule(o[0]);
   checkVisibilityRule(o[1]);
@@ -3457,7 +3329,7 @@
   var o = new api.Visibility();
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    o.rules = buildUnnamed1232();
+    o.rules = buildUnnamed1228();
   }
   buildCounterVisibility--;
   return o;
@@ -3466,7 +3338,7 @@
 checkVisibility(api.Visibility o) {
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    checkUnnamed1232(o.rules);
+    checkUnnamed1228(o.rules);
   }
   buildCounterVisibility--;
 }
@@ -3492,7 +3364,6 @@
   buildCounterVisibilityRule--;
 }
 
-
 main() {
   unittest.group("obj-schema-Advice", () {
     unittest.test("to-json--from-json", () {
@@ -3502,7 +3373,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Api", () {
     unittest.test("to-json--from-json", () {
       var o = buildApi();
@@ -3511,7 +3381,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditConfig();
@@ -3520,7 +3389,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLogConfig();
@@ -3529,7 +3397,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthProvider", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthProvider();
@@ -3538,7 +3405,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthRequirement", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthRequirement();
@@ -3547,7 +3413,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Authentication", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthentication();
@@ -3556,7 +3421,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthenticationRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthenticationRule();
@@ -3565,7 +3429,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthorizationConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthorizationConfig();
@@ -3574,7 +3437,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Backend", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackend();
@@ -3583,7 +3445,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendRule();
@@ -3592,7 +3453,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -3601,7 +3461,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChangeReport", () {
     unittest.test("to-json--from-json", () {
       var o = buildChangeReport();
@@ -3610,25 +3469,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-CloudAuditOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCloudAuditOptions();
-      var od = new api.CloudAuditOptions.fromJson(o.toJson());
-      checkCloudAuditOptions(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Condition", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCondition();
-      var od = new api.Condition.fromJson(o.toJson());
-      checkCondition(od);
-    });
-  });
-
-
   unittest.group("obj-schema-ConfigChange", () {
     unittest.test("to-json--from-json", () {
       var o = buildConfigChange();
@@ -3637,7 +3477,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConfigFile", () {
     unittest.test("to-json--from-json", () {
       var o = buildConfigFile();
@@ -3646,7 +3485,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConfigRef", () {
     unittest.test("to-json--from-json", () {
       var o = buildConfigRef();
@@ -3655,7 +3493,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ConfigSource", () {
     unittest.test("to-json--from-json", () {
       var o = buildConfigSource();
@@ -3664,7 +3501,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Context", () {
     unittest.test("to-json--from-json", () {
       var o = buildContext();
@@ -3673,7 +3509,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ContextRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildContextRule();
@@ -3682,7 +3517,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Control", () {
     unittest.test("to-json--from-json", () {
       var o = buildControl();
@@ -3691,16 +3525,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-CounterOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCounterOptions();
-      var od = new api.CounterOptions.fromJson(o.toJson());
-      checkCounterOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-CustomAuthRequirements", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomAuthRequirements();
@@ -3709,7 +3533,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomError", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomError();
@@ -3718,7 +3541,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomErrorRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomErrorRule();
@@ -3727,7 +3549,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomHttpPattern", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomHttpPattern();
@@ -3736,16 +3557,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-DataAccessOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildDataAccessOptions();
-      var od = new api.DataAccessOptions.fromJson(o.toJson());
-      checkDataAccessOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-DeleteServiceStrategy", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteServiceStrategy();
@@ -3754,7 +3565,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Diagnostic", () {
     unittest.test("to-json--from-json", () {
       var o = buildDiagnostic();
@@ -3763,7 +3573,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DisableServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisableServiceRequest();
@@ -3772,7 +3581,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Documentation", () {
     unittest.test("to-json--from-json", () {
       var o = buildDocumentation();
@@ -3781,7 +3589,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DocumentationRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildDocumentationRule();
@@ -3790,7 +3597,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnableServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnableServiceRequest();
@@ -3799,7 +3605,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Endpoint", () {
     unittest.test("to-json--from-json", () {
       var o = buildEndpoint();
@@ -3808,7 +3613,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Enum", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnum();
@@ -3817,7 +3621,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnumValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnumValue();
@@ -3826,7 +3629,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Experimental", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperimental();
@@ -3835,7 +3637,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Expr", () {
     unittest.test("to-json--from-json", () {
       var o = buildExpr();
@@ -3844,7 +3645,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Field", () {
     unittest.test("to-json--from-json", () {
       var o = buildField();
@@ -3853,7 +3653,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FlowOperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildFlowOperationMetadata();
@@ -3862,7 +3661,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GenerateConfigReportRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGenerateConfigReportRequest();
@@ -3871,7 +3669,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GenerateConfigReportResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGenerateConfigReportResponse();
@@ -3880,7 +3677,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetIamPolicyRequest();
@@ -3889,7 +3685,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Http", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttp();
@@ -3898,7 +3693,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpRule();
@@ -3907,7 +3701,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LabelDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildLabelDescriptor();
@@ -3916,7 +3709,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -3925,7 +3717,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListServiceConfigsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListServiceConfigsResponse();
@@ -3934,7 +3725,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListServiceRolloutsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListServiceRolloutsResponse();
@@ -3943,7 +3733,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListServicesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListServicesResponse();
@@ -3952,16 +3741,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-LogConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildLogConfig();
-      var od = new api.LogConfig.fromJson(o.toJson());
-      checkLogConfig(od);
-    });
-  });
-
-
   unittest.group("obj-schema-LogDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogDescriptor();
@@ -3970,7 +3749,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Logging", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogging();
@@ -3979,7 +3757,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LoggingDestination", () {
     unittest.test("to-json--from-json", () {
       var o = buildLoggingDestination();
@@ -3988,7 +3765,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ManagedService", () {
     unittest.test("to-json--from-json", () {
       var o = buildManagedService();
@@ -3997,7 +3773,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MediaDownload", () {
     unittest.test("to-json--from-json", () {
       var o = buildMediaDownload();
@@ -4006,7 +3781,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MediaUpload", () {
     unittest.test("to-json--from-json", () {
       var o = buildMediaUpload();
@@ -4015,7 +3789,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Method", () {
     unittest.test("to-json--from-json", () {
       var o = buildMethod();
@@ -4024,7 +3797,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricDescriptor();
@@ -4033,7 +3805,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricRule();
@@ -4042,7 +3813,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Mixin", () {
     unittest.test("to-json--from-json", () {
       var o = buildMixin();
@@ -4051,7 +3821,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonitoredResourceDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoredResourceDescriptor();
@@ -4060,7 +3829,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Monitoring", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoring();
@@ -4069,7 +3837,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonitoringDestination", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoringDestination();
@@ -4078,7 +3845,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OAuthRequirements", () {
     unittest.test("to-json--from-json", () {
       var o = buildOAuthRequirements();
@@ -4087,7 +3853,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -4096,7 +3861,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadata();
@@ -4105,7 +3869,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Option", () {
     unittest.test("to-json--from-json", () {
       var o = buildOption();
@@ -4114,7 +3877,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Page", () {
     unittest.test("to-json--from-json", () {
       var o = buildPage();
@@ -4123,7 +3885,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -4132,7 +3893,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Quota", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuota();
@@ -4141,7 +3901,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuotaLimit", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuotaLimit();
@@ -4150,7 +3909,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Rollout", () {
     unittest.test("to-json--from-json", () {
       var o = buildRollout();
@@ -4159,16 +3917,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-Rule", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildRule();
-      var od = new api.Rule.fromJson(o.toJson());
-      checkRule(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Service", () {
     unittest.test("to-json--from-json", () {
       var o = buildService();
@@ -4177,7 +3925,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -4186,7 +3933,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceContext();
@@ -4195,7 +3941,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceInfo();
@@ -4204,7 +3949,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -4213,7 +3957,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Step", () {
     unittest.test("to-json--from-json", () {
       var o = buildStep();
@@ -4222,7 +3965,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubmitConfigSourceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubmitConfigSourceRequest();
@@ -4231,7 +3973,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubmitConfigSourceResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubmitConfigSourceResponse();
@@ -4240,7 +3981,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemParameter", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemParameter();
@@ -4249,7 +3989,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemParameterRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemParameterRule();
@@ -4258,7 +3997,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemParameters", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemParameters();
@@ -4267,7 +4005,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -4276,7 +4013,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -4285,7 +4021,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TrafficPercentStrategy", () {
     unittest.test("to-json--from-json", () {
       var o = buildTrafficPercentStrategy();
@@ -4294,7 +4029,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Type", () {
     unittest.test("to-json--from-json", () {
       var o = buildType();
@@ -4303,7 +4037,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UndeleteServiceResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUndeleteServiceResponse();
@@ -4312,7 +4045,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Usage", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsage();
@@ -4321,7 +4053,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageRule();
@@ -4330,7 +4061,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Visibility", () {
     unittest.test("to-json--from-json", () {
       var o = buildVisibility();
@@ -4339,7 +4069,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VisibilityRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildVisibilityRule();
@@ -4348,21 +4077,22 @@
     });
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.ServicemanagementApi(mock).operations;
+      api.OperationsResourceApi res =
+          new api.ServicemanagementApi(mock).operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4376,16 +4106,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4396,21 +4127,23 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.OperationsResourceApi res = new api.ServicemanagementApi(mock).operations;
-      var arg_pageSize = 42;
-      var arg_filter = "foo";
+      api.OperationsResourceApi res =
+          new api.ServicemanagementApi(mock).operations;
       var arg_pageToken = "foo";
       var arg_name = "foo";
+      var arg_pageSize = 42;
+      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("v1/operations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("v1/operations"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -4423,35 +4156,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageSize: arg_pageSize, filter: arg_filter, pageToken: arg_pageToken, name: arg_name).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(
+              pageToken: arg_pageToken,
+              name: arg_name,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildManagedService();
@@ -4463,9 +4202,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/services"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/services"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -4478,27 +4219,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_serviceName = "foo";
@@ -4507,9 +4250,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4525,27 +4270,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_serviceName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .delete(arg_serviceName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--disable", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildDisableServiceRequest();
@@ -4558,16 +4305,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":disable", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals(":disable"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals(":disable"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -4580,27 +4331,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.disable(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .disable(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--enable", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildEnableServiceRequest();
@@ -4613,16 +4366,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":enable", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":enable"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":enable"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -4635,27 +4392,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.enable(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .enable(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--generateConfigReport", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildGenerateConfigReportRequest();
@@ -4667,9 +4426,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("v1/services:generateConfigReport"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 32),
+            unittest.equals("v1/services:generateConfigReport"));
         pathOffset += 32;
 
         var query = (req.url).query;
@@ -4682,27 +4443,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGenerateConfigReportResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.generateConfigReport(arg_request).then(unittest.expectAsync1(((api.GenerateConfigReportResponse response) {
+      res.generateConfigReport(arg_request).then(
+          unittest.expectAsync1(((api.GenerateConfigReportResponse response) {
         checkGenerateConfigReportResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_serviceName = "foo";
@@ -4711,9 +4473,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4729,47 +4493,53 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildManagedService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_serviceName).then(unittest.expectAsync1(((api.ManagedService response) {
+      res
+          .get(arg_serviceName)
+          .then(unittest.expectAsync1(((api.ManagedService response) {
         checkManagedService(response);
       })));
     });
 
     unittest.test("method--getConfig", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_serviceName = "foo";
-      var arg_configId = "foo";
       var arg_view = "foo";
+      var arg_configId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/config", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/config"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/config"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -4782,29 +4552,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["configId"].first, unittest.equals(arg_configId));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
-
+        unittest.expect(
+            queryMap["configId"].first, unittest.equals(arg_configId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getConfig(arg_serviceName, configId: arg_configId, view: arg_view).then(unittest.expectAsync1(((api.Service response) {
+      res
+          .getConfig(arg_serviceName, view: arg_view, configId: arg_configId)
+          .then(unittest.expectAsync1(((api.Service response) {
         checkService(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildGetIamPolicyRequest();
@@ -4817,9 +4590,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4833,41 +4608,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
-      var arg_pageSize = 42;
       var arg_producerProjectId = "foo";
       var arg_consumerId = "foo";
       var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/services"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/services"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -4880,31 +4659,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["producerProjectId"].first, unittest.equals(arg_producerProjectId));
-        unittest.expect(queryMap["consumerId"].first, unittest.equals(arg_consumerId));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["producerProjectId"].first,
+            unittest.equals(arg_producerProjectId));
+        unittest.expect(
+            queryMap["consumerId"].first, unittest.equals(arg_consumerId));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListServicesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageSize: arg_pageSize, producerProjectId: arg_producerProjectId, consumerId: arg_consumerId, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ListServicesResponse response) {
+      res
+          .list(
+              producerProjectId: arg_producerProjectId,
+              consumerId: arg_consumerId,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListServicesResponse response) {
         checkListServicesResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildSetIamPolicyRequest();
@@ -4917,9 +4706,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4933,27 +4724,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_request = buildTestIamPermissionsRequest();
@@ -4966,9 +4759,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4982,27 +4777,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--undelete", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServicemanagementApi(mock).services;
       var arg_serviceName = "foo";
@@ -5011,16 +4807,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf(":undelete", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":undelete"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":undelete"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5033,33 +4833,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.undelete(arg_serviceName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .undelete(arg_serviceName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesConfigsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConfigsResourceApi res = new api.ServicemanagementApi(mock).services.configs;
+      api.ServicesConfigsResourceApi res =
+          new api.ServicemanagementApi(mock).services.configs;
       var arg_request = buildService();
       var arg_serviceName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5070,16 +4871,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/configs", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/configs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/configs"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5092,29 +4897,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.Service response) {
+      res
+          .create(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.Service response) {
         checkService(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConfigsResourceApi res = new api.ServicemanagementApi(mock).services.configs;
+      api.ServicesConfigsResourceApi res =
+          new api.ServicemanagementApi(mock).services.configs;
       var arg_serviceName = "foo";
       var arg_configId = "foo";
       var arg_view = "foo";
@@ -5123,16 +4931,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/configs/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/configs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/configs/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5148,30 +4960,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildService());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_serviceName, arg_configId, view: arg_view).then(unittest.expectAsync1(((api.Service response) {
+      res
+          .get(arg_serviceName, arg_configId, view: arg_view)
+          .then(unittest.expectAsync1(((api.Service response) {
         checkService(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConfigsResourceApi res = new api.ServicemanagementApi(mock).services.configs;
+      api.ServicesConfigsResourceApi res =
+          new api.ServicemanagementApi(mock).services.configs;
       var arg_serviceName = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -5180,16 +4995,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/configs", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/configs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/configs"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -5202,31 +5021,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListServiceConfigsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_serviceName, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListServiceConfigsResponse response) {
+      res
+          .list(arg_serviceName,
+              pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(
+              unittest.expectAsync1(((api.ListServiceConfigsResponse response) {
         checkListServiceConfigsResponse(response);
       })));
     });
 
     unittest.test("method--submit", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConfigsResourceApi res = new api.ServicemanagementApi(mock).services.configs;
+      api.ServicesConfigsResourceApi res =
+          new api.ServicemanagementApi(mock).services.configs;
       var arg_request = buildSubmitConfigSourceRequest();
       var arg_serviceName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5237,16 +5063,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/configs:submit", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/configs:submit"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("/configs:submit"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -5259,33 +5089,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.submit(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .submit(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesConsumersResourceApi", () {
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConsumersResourceApi res = new api.ServicemanagementApi(mock).services.consumers;
+      api.ServicesConsumersResourceApi res =
+          new api.ServicemanagementApi(mock).services.consumers;
       var arg_request = buildGetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5296,9 +5127,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -5312,29 +5145,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConsumersResourceApi res = new api.ServicemanagementApi(mock).services.consumers;
+      api.ServicesConsumersResourceApi res =
+          new api.ServicemanagementApi(mock).services.consumers;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5345,9 +5181,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -5361,29 +5199,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ServicesConsumersResourceApi res = new api.ServicemanagementApi(mock).services.consumers;
+      api.ServicesConsumersResourceApi res =
+          new api.ServicemanagementApi(mock).services.consumers;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5394,9 +5235,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -5410,33 +5253,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesRolloutsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ServicesRolloutsResourceApi res = new api.ServicemanagementApi(mock).services.rollouts;
+      api.ServicesRolloutsResourceApi res =
+          new api.ServicemanagementApi(mock).services.rollouts;
       var arg_request = buildRollout();
       var arg_serviceName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5447,16 +5290,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/rollouts", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/rollouts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/rollouts"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5469,29 +5316,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_serviceName).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_serviceName)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ServicesRolloutsResourceApi res = new api.ServicemanagementApi(mock).services.rollouts;
+      api.ServicesRolloutsResourceApi res =
+          new api.ServicemanagementApi(mock).services.rollouts;
       var arg_serviceName = "foo";
       var arg_rolloutId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -5499,16 +5349,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/rollouts/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/rollouts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/rollouts/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -5524,29 +5378,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRollout());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_serviceName, arg_rolloutId).then(unittest.expectAsync1(((api.Rollout response) {
+      res
+          .get(arg_serviceName, arg_rolloutId)
+          .then(unittest.expectAsync1(((api.Rollout response) {
         checkRollout(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ServicesRolloutsResourceApi res = new api.ServicemanagementApi(mock).services.rollouts;
+      api.ServicesRolloutsResourceApi res =
+          new api.ServicemanagementApi(mock).services.rollouts;
       var arg_serviceName = "foo";
       var arg_filter = "foo";
       var arg_pageToken = "foo";
@@ -5556,16 +5413,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v1/services/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("v1/services/"));
         pathOffset += 12;
         index = path.indexOf("/rollouts", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_serviceName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/rollouts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/rollouts"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -5578,30 +5439,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListServiceRolloutsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_serviceName, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListServiceRolloutsResponse response) {
+      res
+          .list(arg_serviceName,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.ListServiceRolloutsResponse response) {
         checkListServiceRolloutsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/serviceuser/v1_test.dart b/generated/googleapis/test/serviceuser/v1_test.dart
index e7c13a3..9d2b0eb 100644
--- a/generated/googleapis/test/serviceuser/v1_test.dart
+++ b/generated/googleapis/test/serviceuser/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.serviceuser.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/serviceuser/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,46 +44,46 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1776() {
+buildUnnamed1774() {
   var o = new core.List<api.Method>();
   o.add(buildMethod());
   o.add(buildMethod());
   return o;
 }
 
-checkUnnamed1776(core.List<api.Method> o) {
+checkUnnamed1774(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMethod(o[0]);
   checkMethod(o[1]);
 }
 
-buildUnnamed1777() {
+buildUnnamed1775() {
   var o = new core.List<api.Mixin>();
   o.add(buildMixin());
   o.add(buildMixin());
   return o;
 }
 
-checkUnnamed1777(core.List<api.Mixin> o) {
+checkUnnamed1775(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMixin(o[0]);
   checkMixin(o[1]);
 }
 
-buildUnnamed1778() {
+buildUnnamed1776() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1778(core.List<api.Option> o) {
+checkUnnamed1776(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -95,10 +94,10 @@
   var o = new api.Api();
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    o.methods = buildUnnamed1776();
-    o.mixins = buildUnnamed1777();
+    o.methods = buildUnnamed1774();
+    o.mixins = buildUnnamed1775();
     o.name = "foo";
-    o.options = buildUnnamed1778();
+    o.options = buildUnnamed1776();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
     o.version = "foo";
@@ -110,10 +109,10 @@
 checkApi(api.Api o) {
   buildCounterApi++;
   if (buildCounterApi < 3) {
-    checkUnnamed1776(o.methods);
-    checkUnnamed1777(o.mixins);
+    checkUnnamed1774(o.methods);
+    checkUnnamed1775(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1778(o.options);
+    checkUnnamed1776(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -169,27 +168,27 @@
   buildCounterAuthRequirement--;
 }
 
-buildUnnamed1779() {
+buildUnnamed1777() {
   var o = new core.List<api.AuthProvider>();
   o.add(buildAuthProvider());
   o.add(buildAuthProvider());
   return o;
 }
 
-checkUnnamed1779(core.List<api.AuthProvider> o) {
+checkUnnamed1777(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthProvider(o[0]);
   checkAuthProvider(o[1]);
 }
 
-buildUnnamed1780() {
+buildUnnamed1778() {
   var o = new core.List<api.AuthenticationRule>();
   o.add(buildAuthenticationRule());
   o.add(buildAuthenticationRule());
   return o;
 }
 
-checkUnnamed1780(core.List<api.AuthenticationRule> o) {
+checkUnnamed1778(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthenticationRule(o[0]);
   checkAuthenticationRule(o[1]);
@@ -200,8 +199,8 @@
   var o = new api.Authentication();
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    o.providers = buildUnnamed1779();
-    o.rules = buildUnnamed1780();
+    o.providers = buildUnnamed1777();
+    o.rules = buildUnnamed1778();
   }
   buildCounterAuthentication--;
   return o;
@@ -210,20 +209,20 @@
 checkAuthentication(api.Authentication o) {
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    checkUnnamed1779(o.providers);
-    checkUnnamed1780(o.rules);
+    checkUnnamed1777(o.providers);
+    checkUnnamed1778(o.rules);
   }
   buildCounterAuthentication--;
 }
 
-buildUnnamed1781() {
+buildUnnamed1779() {
   var o = new core.List<api.AuthRequirement>();
   o.add(buildAuthRequirement());
   o.add(buildAuthRequirement());
   return o;
 }
 
-checkUnnamed1781(core.List<api.AuthRequirement> o) {
+checkUnnamed1779(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthRequirement(o[0]);
   checkAuthRequirement(o[1]);
@@ -237,7 +236,7 @@
     o.allowWithoutCredential = true;
     o.customAuth = buildCustomAuthRequirements();
     o.oauth = buildOAuthRequirements();
-    o.requirements = buildUnnamed1781();
+    o.requirements = buildUnnamed1779();
     o.selector = "foo";
   }
   buildCounterAuthenticationRule--;
@@ -250,7 +249,7 @@
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
     checkCustomAuthRequirements(o.customAuth);
     checkOAuthRequirements(o.oauth);
-    checkUnnamed1781(o.requirements);
+    checkUnnamed1779(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterAuthenticationRule--;
@@ -296,14 +295,14 @@
   buildCounterAuthorizationRule--;
 }
 
-buildUnnamed1782() {
+buildUnnamed1780() {
   var o = new core.List<api.BackendRule>();
   o.add(buildBackendRule());
   o.add(buildBackendRule());
   return o;
 }
 
-checkUnnamed1782(core.List<api.BackendRule> o) {
+checkUnnamed1780(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendRule(o[0]);
   checkBackendRule(o[1]);
@@ -314,7 +313,7 @@
   var o = new api.Backend();
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    o.rules = buildUnnamed1782();
+    o.rules = buildUnnamed1780();
   }
   buildCounterBackend--;
   return o;
@@ -323,7 +322,7 @@
 checkBackend(api.Backend o) {
   buildCounterBackend++;
   if (buildCounterBackend < 3) {
-    checkUnnamed1782(o.rules);
+    checkUnnamed1780(o.rules);
   }
   buildCounterBackend--;
 }
@@ -353,14 +352,14 @@
   buildCounterBackendRule--;
 }
 
-buildUnnamed1783() {
+buildUnnamed1781() {
   var o = new core.List<api.ContextRule>();
   o.add(buildContextRule());
   o.add(buildContextRule());
   return o;
 }
 
-checkUnnamed1783(core.List<api.ContextRule> o) {
+checkUnnamed1781(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextRule(o[0]);
   checkContextRule(o[1]);
@@ -371,7 +370,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.rules = buildUnnamed1783();
+    o.rules = buildUnnamed1781();
   }
   buildCounterContext--;
   return o;
@@ -380,32 +379,32 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed1783(o.rules);
+    checkUnnamed1781(o.rules);
   }
   buildCounterContext--;
 }
 
-buildUnnamed1784() {
+buildUnnamed1782() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1784(core.List<core.String> o) {
+checkUnnamed1782(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1785() {
+buildUnnamed1783() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1785(core.List<core.String> o) {
+checkUnnamed1783(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -416,8 +415,8 @@
   var o = new api.ContextRule();
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    o.provided = buildUnnamed1784();
-    o.requested = buildUnnamed1785();
+    o.provided = buildUnnamed1782();
+    o.requested = buildUnnamed1783();
     o.selector = "foo";
   }
   buildCounterContextRule--;
@@ -427,8 +426,8 @@
 checkContextRule(api.ContextRule o) {
   buildCounterContextRule++;
   if (buildCounterContextRule < 3) {
-    checkUnnamed1784(o.provided);
-    checkUnnamed1785(o.requested);
+    checkUnnamed1782(o.provided);
+    checkUnnamed1783(o.requested);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterContextRule--;
@@ -472,27 +471,27 @@
   buildCounterCustomAuthRequirements--;
 }
 
-buildUnnamed1786() {
+buildUnnamed1784() {
   var o = new core.List<api.CustomErrorRule>();
   o.add(buildCustomErrorRule());
   o.add(buildCustomErrorRule());
   return o;
 }
 
-checkUnnamed1786(core.List<api.CustomErrorRule> o) {
+checkUnnamed1784(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomErrorRule(o[0]);
   checkCustomErrorRule(o[1]);
 }
 
-buildUnnamed1787() {
+buildUnnamed1785() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1787(core.List<core.String> o) {
+checkUnnamed1785(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -503,8 +502,8 @@
   var o = new api.CustomError();
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    o.rules = buildUnnamed1786();
-    o.types = buildUnnamed1787();
+    o.rules = buildUnnamed1784();
+    o.types = buildUnnamed1785();
   }
   buildCounterCustomError--;
   return o;
@@ -513,8 +512,8 @@
 checkCustomError(api.CustomError o) {
   buildCounterCustomError++;
   if (buildCounterCustomError < 3) {
-    checkUnnamed1786(o.rules);
-    checkUnnamed1787(o.types);
+    checkUnnamed1784(o.rules);
+    checkUnnamed1785(o.types);
   }
   buildCounterCustomError--;
 }
@@ -565,40 +564,38 @@
 buildDisableServiceRequest() {
   var o = new api.DisableServiceRequest();
   buildCounterDisableServiceRequest++;
-  if (buildCounterDisableServiceRequest < 3) {
-  }
+  if (buildCounterDisableServiceRequest < 3) {}
   buildCounterDisableServiceRequest--;
   return o;
 }
 
 checkDisableServiceRequest(api.DisableServiceRequest o) {
   buildCounterDisableServiceRequest++;
-  if (buildCounterDisableServiceRequest < 3) {
-  }
+  if (buildCounterDisableServiceRequest < 3) {}
   buildCounterDisableServiceRequest--;
 }
 
-buildUnnamed1788() {
+buildUnnamed1786() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1788(core.List<api.Page> o) {
+checkUnnamed1786(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
 }
 
-buildUnnamed1789() {
+buildUnnamed1787() {
   var o = new core.List<api.DocumentationRule>();
   o.add(buildDocumentationRule());
   o.add(buildDocumentationRule());
   return o;
 }
 
-checkUnnamed1789(core.List<api.DocumentationRule> o) {
+checkUnnamed1787(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDocumentationRule(o[0]);
   checkDocumentationRule(o[1]);
@@ -611,8 +608,8 @@
   if (buildCounterDocumentation < 3) {
     o.documentationRootUrl = "foo";
     o.overview = "foo";
-    o.pages = buildUnnamed1788();
-    o.rules = buildUnnamed1789();
+    o.pages = buildUnnamed1786();
+    o.rules = buildUnnamed1787();
     o.summary = "foo";
   }
   buildCounterDocumentation--;
@@ -624,8 +621,8 @@
   if (buildCounterDocumentation < 3) {
     unittest.expect(o.documentationRootUrl, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
-    checkUnnamed1788(o.pages);
-    checkUnnamed1789(o.rules);
+    checkUnnamed1786(o.pages);
+    checkUnnamed1787(o.rules);
     unittest.expect(o.summary, unittest.equals('foo'));
   }
   buildCounterDocumentation--;
@@ -658,19 +655,43 @@
 buildEnableServiceRequest() {
   var o = new api.EnableServiceRequest();
   buildCounterEnableServiceRequest++;
-  if (buildCounterEnableServiceRequest < 3) {
-  }
+  if (buildCounterEnableServiceRequest < 3) {}
   buildCounterEnableServiceRequest--;
   return o;
 }
 
 checkEnableServiceRequest(api.EnableServiceRequest o) {
   buildCounterEnableServiceRequest++;
-  if (buildCounterEnableServiceRequest < 3) {
-  }
+  if (buildCounterEnableServiceRequest < 3) {}
   buildCounterEnableServiceRequest--;
 }
 
+buildUnnamed1788() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1788(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1789() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1789(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed1790() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -684,41 +705,15 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1791() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1791(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1792() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1792(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterEndpoint = 0;
 buildEndpoint() {
   var o = new api.Endpoint();
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    o.aliases = buildUnnamed1790();
+    o.aliases = buildUnnamed1788();
     o.allowCors = true;
-    o.apis = buildUnnamed1791();
-    o.features = buildUnnamed1792();
+    o.apis = buildUnnamed1789();
+    o.features = buildUnnamed1790();
     o.name = "foo";
     o.target = "foo";
   }
@@ -729,37 +724,37 @@
 checkEndpoint(api.Endpoint o) {
   buildCounterEndpoint++;
   if (buildCounterEndpoint < 3) {
-    checkUnnamed1790(o.aliases);
+    checkUnnamed1788(o.aliases);
     unittest.expect(o.allowCors, unittest.isTrue);
-    checkUnnamed1791(o.apis);
-    checkUnnamed1792(o.features);
+    checkUnnamed1789(o.apis);
+    checkUnnamed1790(o.features);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
   }
   buildCounterEndpoint--;
 }
 
-buildUnnamed1793() {
+buildUnnamed1791() {
   var o = new core.List<api.EnumValue>();
   o.add(buildEnumValue());
   o.add(buildEnumValue());
   return o;
 }
 
-checkUnnamed1793(core.List<api.EnumValue> o) {
+checkUnnamed1791(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnumValue(o[0]);
   checkEnumValue(o[1]);
 }
 
-buildUnnamed1794() {
+buildUnnamed1792() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1794(core.List<api.Option> o) {
+checkUnnamed1792(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -770,9 +765,9 @@
   var o = new api.Enum();
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    o.enumvalue = buildUnnamed1793();
+    o.enumvalue = buildUnnamed1791();
     o.name = "foo";
-    o.options = buildUnnamed1794();
+    o.options = buildUnnamed1792();
     o.sourceContext = buildSourceContext();
     o.syntax = "foo";
   }
@@ -783,23 +778,23 @@
 checkEnum(api.Enum o) {
   buildCounterEnum++;
   if (buildCounterEnum < 3) {
-    checkUnnamed1793(o.enumvalue);
+    checkUnnamed1791(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1794(o.options);
+    checkUnnamed1792(o.options);
     checkSourceContext(o.sourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
 }
 
-buildUnnamed1795() {
+buildUnnamed1793() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1795(core.List<api.Option> o) {
+checkUnnamed1793(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -812,7 +807,7 @@
   if (buildCounterEnumValue < 3) {
     o.name = "foo";
     o.number = 42;
-    o.options = buildUnnamed1795();
+    o.options = buildUnnamed1793();
   }
   buildCounterEnumValue--;
   return o;
@@ -823,7 +818,7 @@
   if (buildCounterEnumValue < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
-    checkUnnamed1795(o.options);
+    checkUnnamed1793(o.options);
   }
   buildCounterEnumValue--;
 }
@@ -847,14 +842,14 @@
   buildCounterExperimental--;
 }
 
-buildUnnamed1796() {
+buildUnnamed1794() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1796(core.List<api.Option> o) {
+checkUnnamed1794(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -872,7 +867,7 @@
     o.name = "foo";
     o.number = 42;
     o.oneofIndex = 42;
-    o.options = buildUnnamed1796();
+    o.options = buildUnnamed1794();
     o.packed = true;
     o.typeUrl = "foo";
   }
@@ -890,21 +885,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.oneofIndex, unittest.equals(42));
-    checkUnnamed1796(o.options);
+    checkUnnamed1794(o.options);
     unittest.expect(o.packed, unittest.isTrue);
     unittest.expect(o.typeUrl, unittest.equals('foo'));
   }
   buildCounterField--;
 }
 
-buildUnnamed1797() {
+buildUnnamed1795() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1797(core.List<api.HttpRule> o) {
+checkUnnamed1795(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
@@ -916,7 +911,7 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     o.fullyDecodeReservedExpansion = true;
-    o.rules = buildUnnamed1797();
+    o.rules = buildUnnamed1795();
   }
   buildCounterHttp--;
   return o;
@@ -926,32 +921,32 @@
   buildCounterHttp++;
   if (buildCounterHttp < 3) {
     unittest.expect(o.fullyDecodeReservedExpansion, unittest.isTrue);
-    checkUnnamed1797(o.rules);
+    checkUnnamed1795(o.rules);
   }
   buildCounterHttp--;
 }
 
-buildUnnamed1798() {
+buildUnnamed1796() {
   var o = new core.List<api.HttpRule>();
   o.add(buildHttpRule());
   o.add(buildHttpRule());
   return o;
 }
 
-checkUnnamed1798(core.List<api.HttpRule> o) {
+checkUnnamed1796(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpRule(o[0]);
   checkHttpRule(o[1]);
 }
 
-buildUnnamed1799() {
+buildUnnamed1797() {
   var o = new core.List<api.AuthorizationRule>();
   o.add(buildAuthorizationRule());
   o.add(buildAuthorizationRule());
   return o;
 }
 
-checkUnnamed1799(core.List<api.AuthorizationRule> o) {
+checkUnnamed1797(core.List<api.AuthorizationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthorizationRule(o[0]);
   checkAuthorizationRule(o[1]);
@@ -962,8 +957,8 @@
   var o = new api.HttpRule();
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    o.additionalBindings = buildUnnamed1798();
-    o.authorizations = buildUnnamed1799();
+    o.additionalBindings = buildUnnamed1796();
+    o.authorizations = buildUnnamed1797();
     o.body = "foo";
     o.custom = buildCustomHttpPattern();
     o.delete = "foo";
@@ -985,8 +980,8 @@
 checkHttpRule(api.HttpRule o) {
   buildCounterHttpRule++;
   if (buildCounterHttpRule < 3) {
-    checkUnnamed1798(o.additionalBindings);
-    checkUnnamed1799(o.authorizations);
+    checkUnnamed1796(o.additionalBindings);
+    checkUnnamed1797(o.authorizations);
     unittest.expect(o.body, unittest.equals('foo'));
     checkCustomHttpPattern(o.custom);
     unittest.expect(o.delete, unittest.equals('foo'));
@@ -1027,14 +1022,14 @@
   buildCounterLabelDescriptor--;
 }
 
-buildUnnamed1800() {
+buildUnnamed1798() {
   var o = new core.List<api.PublishedService>();
   o.add(buildPublishedService());
   o.add(buildPublishedService());
   return o;
 }
 
-checkUnnamed1800(core.List<api.PublishedService> o) {
+checkUnnamed1798(core.List<api.PublishedService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedService(o[0]);
   checkPublishedService(o[1]);
@@ -1046,7 +1041,7 @@
   buildCounterListEnabledServicesResponse++;
   if (buildCounterListEnabledServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed1800();
+    o.services = buildUnnamed1798();
   }
   buildCounterListEnabledServicesResponse--;
   return o;
@@ -1056,19 +1051,19 @@
   buildCounterListEnabledServicesResponse++;
   if (buildCounterListEnabledServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1800(o.services);
+    checkUnnamed1798(o.services);
   }
   buildCounterListEnabledServicesResponse--;
 }
 
-buildUnnamed1801() {
+buildUnnamed1799() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1801(core.List<api.LabelDescriptor> o) {
+checkUnnamed1799(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1081,7 +1076,7 @@
   if (buildCounterLogDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1801();
+    o.labels = buildUnnamed1799();
     o.name = "foo";
   }
   buildCounterLogDescriptor--;
@@ -1093,33 +1088,33 @@
   if (buildCounterLogDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1801(o.labels);
+    checkUnnamed1799(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterLogDescriptor--;
 }
 
-buildUnnamed1802() {
+buildUnnamed1800() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1802(core.List<api.LoggingDestination> o) {
+checkUnnamed1800(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
 }
 
-buildUnnamed1803() {
+buildUnnamed1801() {
   var o = new core.List<api.LoggingDestination>();
   o.add(buildLoggingDestination());
   o.add(buildLoggingDestination());
   return o;
 }
 
-checkUnnamed1803(core.List<api.LoggingDestination> o) {
+checkUnnamed1801(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLoggingDestination(o[0]);
   checkLoggingDestination(o[1]);
@@ -1130,8 +1125,8 @@
   var o = new api.Logging();
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    o.consumerDestinations = buildUnnamed1802();
-    o.producerDestinations = buildUnnamed1803();
+    o.consumerDestinations = buildUnnamed1800();
+    o.producerDestinations = buildUnnamed1801();
   }
   buildCounterLogging--;
   return o;
@@ -1140,20 +1135,20 @@
 checkLogging(api.Logging o) {
   buildCounterLogging++;
   if (buildCounterLogging < 3) {
-    checkUnnamed1802(o.consumerDestinations);
-    checkUnnamed1803(o.producerDestinations);
+    checkUnnamed1800(o.consumerDestinations);
+    checkUnnamed1801(o.producerDestinations);
   }
   buildCounterLogging--;
 }
 
-buildUnnamed1804() {
+buildUnnamed1802() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1804(core.List<core.String> o) {
+checkUnnamed1802(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1164,7 +1159,7 @@
   var o = new api.LoggingDestination();
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    o.logs = buildUnnamed1804();
+    o.logs = buildUnnamed1802();
     o.monitoredResource = "foo";
   }
   buildCounterLoggingDestination--;
@@ -1174,7 +1169,7 @@
 checkLoggingDestination(api.LoggingDestination o) {
   buildCounterLoggingDestination++;
   if (buildCounterLoggingDestination < 3) {
-    checkUnnamed1804(o.logs);
+    checkUnnamed1802(o.logs);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterLoggingDestination--;
@@ -1209,14 +1204,14 @@
   buildCounterMediaDownload--;
 }
 
-buildUnnamed1805() {
+buildUnnamed1803() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1805(core.List<core.String> o) {
+checkUnnamed1803(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1231,7 +1226,7 @@
     o.dropzone = "foo";
     o.enabled = true;
     o.maxSize = "foo";
-    o.mimeTypes = buildUnnamed1805();
+    o.mimeTypes = buildUnnamed1803();
     o.progressNotification = true;
     o.startNotification = true;
     o.uploadService = "foo";
@@ -1247,7 +1242,7 @@
     unittest.expect(o.dropzone, unittest.equals('foo'));
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.maxSize, unittest.equals('foo'));
-    checkUnnamed1805(o.mimeTypes);
+    checkUnnamed1803(o.mimeTypes);
     unittest.expect(o.progressNotification, unittest.isTrue);
     unittest.expect(o.startNotification, unittest.isTrue);
     unittest.expect(o.uploadService, unittest.equals('foo'));
@@ -1255,14 +1250,14 @@
   buildCounterMediaUpload--;
 }
 
-buildUnnamed1806() {
+buildUnnamed1804() {
   var o = new core.List<api.Option>();
   o.add(buildOption());
   o.add(buildOption());
   return o;
 }
 
-checkUnnamed1806(core.List<api.Option> o) {
+checkUnnamed1804(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOption(o[0]);
   checkOption(o[1]);
@@ -1274,7 +1269,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     o.name = "foo";
-    o.options = buildUnnamed1806();
+    o.options = buildUnnamed1804();
     o.requestStreaming = true;
     o.requestTypeUrl = "foo";
     o.responseStreaming = true;
@@ -1289,7 +1284,7 @@
   buildCounterMethod++;
   if (buildCounterMethod < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1806(o.options);
+    checkUnnamed1804(o.options);
     unittest.expect(o.requestStreaming, unittest.isTrue);
     unittest.expect(o.requestTypeUrl, unittest.equals('foo'));
     unittest.expect(o.responseStreaming, unittest.isTrue);
@@ -1299,14 +1294,14 @@
   buildCounterMethod--;
 }
 
-buildUnnamed1807() {
+buildUnnamed1805() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1807(core.List<api.LabelDescriptor> o) {
+checkUnnamed1805(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1319,7 +1314,7 @@
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1807();
+    o.labels = buildUnnamed1805();
     o.metricKind = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1335,7 +1330,7 @@
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1807(o.labels);
+    checkUnnamed1805(o.labels);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1345,14 +1340,14 @@
   buildCounterMetricDescriptor--;
 }
 
-buildUnnamed1808() {
+buildUnnamed1806() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1808(core.Map<core.String, core.String> o) {
+checkUnnamed1806(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1363,7 +1358,7 @@
   var o = new api.MetricRule();
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    o.metricCosts = buildUnnamed1808();
+    o.metricCosts = buildUnnamed1806();
     o.selector = "foo";
   }
   buildCounterMetricRule--;
@@ -1373,7 +1368,7 @@
 checkMetricRule(api.MetricRule o) {
   buildCounterMetricRule++;
   if (buildCounterMetricRule < 3) {
-    checkUnnamed1808(o.metricCosts);
+    checkUnnamed1806(o.metricCosts);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterMetricRule--;
@@ -1400,14 +1395,14 @@
   buildCounterMixin--;
 }
 
-buildUnnamed1809() {
+buildUnnamed1807() {
   var o = new core.List<api.LabelDescriptor>();
   o.add(buildLabelDescriptor());
   o.add(buildLabelDescriptor());
   return o;
 }
 
-checkUnnamed1809(core.List<api.LabelDescriptor> o) {
+checkUnnamed1807(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabelDescriptor(o[0]);
   checkLabelDescriptor(o[1]);
@@ -1420,7 +1415,7 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     o.description = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed1809();
+    o.labels = buildUnnamed1807();
     o.name = "foo";
     o.type = "foo";
   }
@@ -1433,34 +1428,34 @@
   if (buildCounterMonitoredResourceDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed1809(o.labels);
+    checkUnnamed1807(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterMonitoredResourceDescriptor--;
 }
 
-buildUnnamed1810() {
+buildUnnamed1808() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1810(core.List<api.MonitoringDestination> o) {
+checkUnnamed1808(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
 }
 
-buildUnnamed1811() {
+buildUnnamed1809() {
   var o = new core.List<api.MonitoringDestination>();
   o.add(buildMonitoringDestination());
   o.add(buildMonitoringDestination());
   return o;
 }
 
-checkUnnamed1811(core.List<api.MonitoringDestination> o) {
+checkUnnamed1809(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoringDestination(o[0]);
   checkMonitoringDestination(o[1]);
@@ -1471,8 +1466,8 @@
   var o = new api.Monitoring();
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    o.consumerDestinations = buildUnnamed1810();
-    o.producerDestinations = buildUnnamed1811();
+    o.consumerDestinations = buildUnnamed1808();
+    o.producerDestinations = buildUnnamed1809();
   }
   buildCounterMonitoring--;
   return o;
@@ -1481,20 +1476,20 @@
 checkMonitoring(api.Monitoring o) {
   buildCounterMonitoring++;
   if (buildCounterMonitoring < 3) {
-    checkUnnamed1810(o.consumerDestinations);
-    checkUnnamed1811(o.producerDestinations);
+    checkUnnamed1808(o.consumerDestinations);
+    checkUnnamed1809(o.producerDestinations);
   }
   buildCounterMonitoring--;
 }
 
-buildUnnamed1812() {
+buildUnnamed1810() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1812(core.List<core.String> o) {
+checkUnnamed1810(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1505,7 +1500,7 @@
   var o = new api.MonitoringDestination();
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    o.metrics = buildUnnamed1812();
+    o.metrics = buildUnnamed1810();
     o.monitoredResource = "foo";
   }
   buildCounterMonitoringDestination--;
@@ -1515,7 +1510,7 @@
 checkMonitoringDestination(api.MonitoringDestination o) {
   buildCounterMonitoringDestination++;
   if (buildCounterMonitoringDestination < 3) {
-    checkUnnamed1812(o.metrics);
+    checkUnnamed1810(o.metrics);
     unittest.expect(o.monitoredResource, unittest.equals('foo'));
   }
   buildCounterMonitoringDestination--;
@@ -1540,30 +1535,62 @@
   buildCounterOAuthRequirements--;
 }
 
-buildUnnamed1813() {
+buildUnnamed1811() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1813(core.Map<core.String, core.Object> o) {
+checkUnnamed1811(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1814() {
+buildUnnamed1812() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1814(core.Map<core.String, core.Object> o) {
+checkUnnamed1812(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -1573,9 +1600,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1813();
+    o.metadata = buildUnnamed1811();
     o.name = "foo";
-    o.response = buildUnnamed1814();
+    o.response = buildUnnamed1812();
   }
   buildCounterOperation--;
   return o;
@@ -1586,34 +1613,34 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1813(o.metadata);
+    checkUnnamed1811(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1814(o.response);
+    checkUnnamed1812(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1815() {
+buildUnnamed1813() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1815(core.List<core.String> o) {
+checkUnnamed1813(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1816() {
+buildUnnamed1814() {
   var o = new core.List<api.Step>();
   o.add(buildStep());
   o.add(buildStep());
   return o;
 }
 
-checkUnnamed1816(core.List<api.Step> o) {
+checkUnnamed1814(core.List<api.Step> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStep(o[0]);
   checkStep(o[1]);
@@ -1625,9 +1652,9 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     o.progressPercentage = 42;
-    o.resourceNames = buildUnnamed1815();
+    o.resourceNames = buildUnnamed1813();
     o.startTime = "foo";
-    o.steps = buildUnnamed1816();
+    o.steps = buildUnnamed1814();
   }
   buildCounterOperationMetadata--;
   return o;
@@ -1637,24 +1664,40 @@
   buildCounterOperationMetadata++;
   if (buildCounterOperationMetadata < 3) {
     unittest.expect(o.progressPercentage, unittest.equals(42));
-    checkUnnamed1815(o.resourceNames);
+    checkUnnamed1813(o.resourceNames);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkUnnamed1816(o.steps);
+    checkUnnamed1814(o.steps);
   }
   buildCounterOperationMetadata--;
 }
 
-buildUnnamed1817() {
+buildUnnamed1815() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1817(core.Map<core.String, core.Object> o) {
+checkUnnamed1815(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOption = 0;
@@ -1663,7 +1706,7 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     o.name = "foo";
-    o.value = buildUnnamed1817();
+    o.value = buildUnnamed1815();
   }
   buildCounterOption--;
   return o;
@@ -1673,19 +1716,19 @@
   buildCounterOption++;
   if (buildCounterOption < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1817(o.value);
+    checkUnnamed1815(o.value);
   }
   buildCounterOption--;
 }
 
-buildUnnamed1818() {
+buildUnnamed1816() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1818(core.List<api.Page> o) {
+checkUnnamed1816(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -1698,7 +1741,7 @@
   if (buildCounterPage < 3) {
     o.content = "foo";
     o.name = "foo";
-    o.subpages = buildUnnamed1818();
+    o.subpages = buildUnnamed1816();
   }
   buildCounterPage--;
   return o;
@@ -1709,7 +1752,7 @@
   if (buildCounterPage < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1818(o.subpages);
+    checkUnnamed1816(o.subpages);
   }
   buildCounterPage--;
 }
@@ -1735,27 +1778,27 @@
   buildCounterPublishedService--;
 }
 
-buildUnnamed1819() {
+buildUnnamed1817() {
   var o = new core.List<api.QuotaLimit>();
   o.add(buildQuotaLimit());
   o.add(buildQuotaLimit());
   return o;
 }
 
-checkUnnamed1819(core.List<api.QuotaLimit> o) {
+checkUnnamed1817(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuotaLimit(o[0]);
   checkQuotaLimit(o[1]);
 }
 
-buildUnnamed1820() {
+buildUnnamed1818() {
   var o = new core.List<api.MetricRule>();
   o.add(buildMetricRule());
   o.add(buildMetricRule());
   return o;
 }
 
-checkUnnamed1820(core.List<api.MetricRule> o) {
+checkUnnamed1818(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricRule(o[0]);
   checkMetricRule(o[1]);
@@ -1766,8 +1809,8 @@
   var o = new api.Quota();
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    o.limits = buildUnnamed1819();
-    o.metricRules = buildUnnamed1820();
+    o.limits = buildUnnamed1817();
+    o.metricRules = buildUnnamed1818();
   }
   buildCounterQuota--;
   return o;
@@ -1776,20 +1819,20 @@
 checkQuota(api.Quota o) {
   buildCounterQuota++;
   if (buildCounterQuota < 3) {
-    checkUnnamed1819(o.limits);
-    checkUnnamed1820(o.metricRules);
+    checkUnnamed1817(o.limits);
+    checkUnnamed1818(o.metricRules);
   }
   buildCounterQuota--;
 }
 
-buildUnnamed1821() {
+buildUnnamed1819() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1821(core.Map<core.String, core.String> o) {
+checkUnnamed1819(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1809,7 +1852,7 @@
     o.metric = "foo";
     o.name = "foo";
     o.unit = "foo";
-    o.values = buildUnnamed1821();
+    o.values = buildUnnamed1819();
   }
   buildCounterQuotaLimit--;
   return o;
@@ -1827,19 +1870,19 @@
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
-    checkUnnamed1821(o.values);
+    checkUnnamed1819(o.values);
   }
   buildCounterQuotaLimit--;
 }
 
-buildUnnamed1822() {
+buildUnnamed1820() {
   var o = new core.List<api.PublishedService>();
   o.add(buildPublishedService());
   o.add(buildPublishedService());
   return o;
 }
 
-checkUnnamed1822(core.List<api.PublishedService> o) {
+checkUnnamed1820(core.List<api.PublishedService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedService(o[0]);
   checkPublishedService(o[1]);
@@ -1851,7 +1894,7 @@
   buildCounterSearchServicesResponse++;
   if (buildCounterSearchServicesResponse < 3) {
     o.nextPageToken = "foo";
-    o.services = buildUnnamed1822();
+    o.services = buildUnnamed1820();
   }
   buildCounterSearchServicesResponse--;
   return o;
@@ -1861,110 +1904,110 @@
   buildCounterSearchServicesResponse++;
   if (buildCounterSearchServicesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1822(o.services);
+    checkUnnamed1820(o.services);
   }
   buildCounterSearchServicesResponse--;
 }
 
-buildUnnamed1823() {
+buildUnnamed1821() {
   var o = new core.List<api.Api>();
   o.add(buildApi());
   o.add(buildApi());
   return o;
 }
 
-checkUnnamed1823(core.List<api.Api> o) {
+checkUnnamed1821(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApi(o[0]);
   checkApi(o[1]);
 }
 
-buildUnnamed1824() {
+buildUnnamed1822() {
   var o = new core.List<api.Endpoint>();
   o.add(buildEndpoint());
   o.add(buildEndpoint());
   return o;
 }
 
-checkUnnamed1824(core.List<api.Endpoint> o) {
+checkUnnamed1822(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEndpoint(o[0]);
   checkEndpoint(o[1]);
 }
 
-buildUnnamed1825() {
+buildUnnamed1823() {
   var o = new core.List<api.Enum>();
   o.add(buildEnum());
   o.add(buildEnum());
   return o;
 }
 
-checkUnnamed1825(core.List<api.Enum> o) {
+checkUnnamed1823(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnum(o[0]);
   checkEnum(o[1]);
 }
 
-buildUnnamed1826() {
+buildUnnamed1824() {
   var o = new core.List<api.LogDescriptor>();
   o.add(buildLogDescriptor());
   o.add(buildLogDescriptor());
   return o;
 }
 
-checkUnnamed1826(core.List<api.LogDescriptor> o) {
+checkUnnamed1824(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogDescriptor(o[0]);
   checkLogDescriptor(o[1]);
 }
 
-buildUnnamed1827() {
+buildUnnamed1825() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1827(core.List<api.MetricDescriptor> o) {
+checkUnnamed1825(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
 }
 
-buildUnnamed1828() {
+buildUnnamed1826() {
   var o = new core.List<api.MonitoredResourceDescriptor>();
   o.add(buildMonitoredResourceDescriptor());
   o.add(buildMonitoredResourceDescriptor());
   return o;
 }
 
-checkUnnamed1828(core.List<api.MonitoredResourceDescriptor> o) {
+checkUnnamed1826(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMonitoredResourceDescriptor(o[0]);
   checkMonitoredResourceDescriptor(o[1]);
 }
 
-buildUnnamed1829() {
+buildUnnamed1827() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1829(core.List<api.Type> o) {
+checkUnnamed1827(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
 }
 
-buildUnnamed1830() {
+buildUnnamed1828() {
   var o = new core.List<api.Type>();
   o.add(buildType());
   o.add(buildType());
   return o;
 }
 
-checkUnnamed1830(core.List<api.Type> o) {
+checkUnnamed1828(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o[0]);
   checkType(o[1]);
@@ -1975,7 +2018,7 @@
   var o = new api.Service();
   buildCounterService++;
   if (buildCounterService < 3) {
-    o.apis = buildUnnamed1823();
+    o.apis = buildUnnamed1821();
     o.authentication = buildAuthentication();
     o.backend = buildBackend();
     o.configVersion = 42;
@@ -1983,24 +2026,24 @@
     o.control = buildControl();
     o.customError = buildCustomError();
     o.documentation = buildDocumentation();
-    o.endpoints = buildUnnamed1824();
-    o.enums = buildUnnamed1825();
+    o.endpoints = buildUnnamed1822();
+    o.enums = buildUnnamed1823();
     o.experimental = buildExperimental();
     o.http = buildHttp();
     o.id = "foo";
     o.logging = buildLogging();
-    o.logs = buildUnnamed1826();
-    o.metrics = buildUnnamed1827();
-    o.monitoredResources = buildUnnamed1828();
+    o.logs = buildUnnamed1824();
+    o.metrics = buildUnnamed1825();
+    o.monitoredResources = buildUnnamed1826();
     o.monitoring = buildMonitoring();
     o.name = "foo";
     o.producerProjectId = "foo";
     o.quota = buildQuota();
     o.sourceInfo = buildSourceInfo();
     o.systemParameters = buildSystemParameters();
-    o.systemTypes = buildUnnamed1829();
+    o.systemTypes = buildUnnamed1827();
     o.title = "foo";
-    o.types = buildUnnamed1830();
+    o.types = buildUnnamed1828();
     o.usage = buildUsage();
     o.visibility = buildVisibility();
   }
@@ -2011,7 +2054,7 @@
 checkService(api.Service o) {
   buildCounterService++;
   if (buildCounterService < 3) {
-    checkUnnamed1823(o.apis);
+    checkUnnamed1821(o.apis);
     checkAuthentication(o.authentication);
     checkBackend(o.backend);
     unittest.expect(o.configVersion, unittest.equals(42));
@@ -2019,24 +2062,24 @@
     checkControl(o.control);
     checkCustomError(o.customError);
     checkDocumentation(o.documentation);
-    checkUnnamed1824(o.endpoints);
-    checkUnnamed1825(o.enums);
+    checkUnnamed1822(o.endpoints);
+    checkUnnamed1823(o.enums);
     checkExperimental(o.experimental);
     checkHttp(o.http);
     unittest.expect(o.id, unittest.equals('foo'));
     checkLogging(o.logging);
-    checkUnnamed1826(o.logs);
-    checkUnnamed1827(o.metrics);
-    checkUnnamed1828(o.monitoredResources);
+    checkUnnamed1824(o.logs);
+    checkUnnamed1825(o.metrics);
+    checkUnnamed1826(o.monitoredResources);
     checkMonitoring(o.monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
     checkQuota(o.quota);
     checkSourceInfo(o.sourceInfo);
     checkSystemParameters(o.systemParameters);
-    checkUnnamed1829(o.systemTypes);
+    checkUnnamed1827(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUnnamed1830(o.types);
+    checkUnnamed1828(o.types);
     checkUsage(o.usage);
     checkVisibility(o.visibility);
   }
@@ -2062,17 +2105,94 @@
   buildCounterSourceContext--;
 }
 
+buildUnnamed1829() {
+  var o = new core.Map<core.String, core.Object>();
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  return o;
+}
+
+checkUnnamed1829(core.Map<core.String, core.Object> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted7 = (o["x"]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o["y"]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
+}
+
+buildUnnamed1830() {
+  var o = new core.List<core.Map<core.String, core.Object>>();
+  o.add(buildUnnamed1829());
+  o.add(buildUnnamed1829());
+  return o;
+}
+
+checkUnnamed1830(core.List<core.Map<core.String, core.Object>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1829(o[0]);
+  checkUnnamed1829(o[1]);
+}
+
+core.int buildCounterSourceInfo = 0;
+buildSourceInfo() {
+  var o = new api.SourceInfo();
+  buildCounterSourceInfo++;
+  if (buildCounterSourceInfo < 3) {
+    o.sourceFiles = buildUnnamed1830();
+  }
+  buildCounterSourceInfo--;
+  return o;
+}
+
+checkSourceInfo(api.SourceInfo o) {
+  buildCounterSourceInfo++;
+  if (buildCounterSourceInfo < 3) {
+    checkUnnamed1830(o.sourceFiles);
+  }
+  buildCounterSourceInfo--;
+}
+
 buildUnnamed1831() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
 checkUnnamed1831(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o["x"]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o["y"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted9 = (o["x"]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o["y"]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
 buildUnnamed1832() {
@@ -2088,58 +2208,13 @@
   checkUnnamed1831(o[1]);
 }
 
-core.int buildCounterSourceInfo = 0;
-buildSourceInfo() {
-  var o = new api.SourceInfo();
-  buildCounterSourceInfo++;
-  if (buildCounterSourceInfo < 3) {
-    o.sourceFiles = buildUnnamed1832();
-  }
-  buildCounterSourceInfo--;
-  return o;
-}
-
-checkSourceInfo(api.SourceInfo o) {
-  buildCounterSourceInfo++;
-  if (buildCounterSourceInfo < 3) {
-    checkUnnamed1832(o.sourceFiles);
-  }
-  buildCounterSourceInfo--;
-}
-
-buildUnnamed1833() {
-  var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  return o;
-}
-
-checkUnnamed1833(core.Map<core.String, core.Object> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o["x"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o["y"]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
-}
-
-buildUnnamed1834() {
-  var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1833());
-  o.add(buildUnnamed1833());
-  return o;
-}
-
-checkUnnamed1834(core.List<core.Map<core.String, core.Object>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1833(o[0]);
-  checkUnnamed1833(o[1]);
-}
-
 core.int buildCounterStatus = 0;
 buildStatus() {
   var o = new api.Status();
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1834();
+    o.details = buildUnnamed1832();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -2150,7 +2225,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1834(o.details);
+    checkUnnamed1832(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -2200,14 +2275,14 @@
   buildCounterSystemParameter--;
 }
 
-buildUnnamed1835() {
+buildUnnamed1833() {
   var o = new core.List<api.SystemParameter>();
   o.add(buildSystemParameter());
   o.add(buildSystemParameter());
   return o;
 }
 
-checkUnnamed1835(core.List<api.SystemParameter> o) {
+checkUnnamed1833(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameter(o[0]);
   checkSystemParameter(o[1]);
@@ -2218,7 +2293,7 @@
   var o = new api.SystemParameterRule();
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    o.parameters = buildUnnamed1835();
+    o.parameters = buildUnnamed1833();
     o.selector = "foo";
   }
   buildCounterSystemParameterRule--;
@@ -2228,20 +2303,20 @@
 checkSystemParameterRule(api.SystemParameterRule o) {
   buildCounterSystemParameterRule++;
   if (buildCounterSystemParameterRule < 3) {
-    checkUnnamed1835(o.parameters);
+    checkUnnamed1833(o.parameters);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
   buildCounterSystemParameterRule--;
 }
 
-buildUnnamed1836() {
+buildUnnamed1834() {
   var o = new core.List<api.SystemParameterRule>();
   o.add(buildSystemParameterRule());
   o.add(buildSystemParameterRule());
   return o;
 }
 
-checkUnnamed1836(core.List<api.SystemParameterRule> o) {
+checkUnnamed1834(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSystemParameterRule(o[0]);
   checkSystemParameterRule(o[1]);
@@ -2252,7 +2327,7 @@
   var o = new api.SystemParameters();
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    o.rules = buildUnnamed1836();
+    o.rules = buildUnnamed1834();
   }
   buildCounterSystemParameters--;
   return o;
@@ -2261,24 +2336,79 @@
 checkSystemParameters(api.SystemParameters o) {
   buildCounterSystemParameters++;
   if (buildCounterSystemParameters < 3) {
-    checkUnnamed1836(o.rules);
+    checkUnnamed1834(o.rules);
   }
   buildCounterSystemParameters--;
 }
 
-buildUnnamed1837() {
+buildUnnamed1835() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed1837(core.List<api.Field> o) {
+checkUnnamed1835(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
 }
 
+buildUnnamed1836() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1836(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1837() {
+  var o = new core.List<api.Option>();
+  o.add(buildOption());
+  o.add(buildOption());
+  return o;
+}
+
+checkUnnamed1837(core.List<api.Option> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOption(o[0]);
+  checkOption(o[1]);
+}
+
+core.int buildCounterType = 0;
+buildType() {
+  var o = new api.Type();
+  buildCounterType++;
+  if (buildCounterType < 3) {
+    o.fields = buildUnnamed1835();
+    o.name = "foo";
+    o.oneofs = buildUnnamed1836();
+    o.options = buildUnnamed1837();
+    o.sourceContext = buildSourceContext();
+    o.syntax = "foo";
+  }
+  buildCounterType--;
+  return o;
+}
+
+checkType(api.Type o) {
+  buildCounterType++;
+  if (buildCounterType < 3) {
+    checkUnnamed1835(o.fields);
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed1836(o.oneofs);
+    checkUnnamed1837(o.options);
+    checkSourceContext(o.sourceContext);
+    unittest.expect(o.syntax, unittest.equals('foo'));
+  }
+  buildCounterType--;
+}
+
 buildUnnamed1838() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -2293,68 +2423,13 @@
 }
 
 buildUnnamed1839() {
-  var o = new core.List<api.Option>();
-  o.add(buildOption());
-  o.add(buildOption());
-  return o;
-}
-
-checkUnnamed1839(core.List<api.Option> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
-}
-
-core.int buildCounterType = 0;
-buildType() {
-  var o = new api.Type();
-  buildCounterType++;
-  if (buildCounterType < 3) {
-    o.fields = buildUnnamed1837();
-    o.name = "foo";
-    o.oneofs = buildUnnamed1838();
-    o.options = buildUnnamed1839();
-    o.sourceContext = buildSourceContext();
-    o.syntax = "foo";
-  }
-  buildCounterType--;
-  return o;
-}
-
-checkType(api.Type o) {
-  buildCounterType++;
-  if (buildCounterType < 3) {
-    checkUnnamed1837(o.fields);
-    unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1838(o.oneofs);
-    checkUnnamed1839(o.options);
-    checkSourceContext(o.sourceContext);
-    unittest.expect(o.syntax, unittest.equals('foo'));
-  }
-  buildCounterType--;
-}
-
-buildUnnamed1840() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1840(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1841() {
   var o = new core.List<api.UsageRule>();
   o.add(buildUsageRule());
   o.add(buildUsageRule());
   return o;
 }
 
-checkUnnamed1841(core.List<api.UsageRule> o) {
+checkUnnamed1839(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageRule(o[0]);
   checkUsageRule(o[1]);
@@ -2366,8 +2441,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     o.producerNotificationChannel = "foo";
-    o.requirements = buildUnnamed1840();
-    o.rules = buildUnnamed1841();
+    o.requirements = buildUnnamed1838();
+    o.rules = buildUnnamed1839();
   }
   buildCounterUsage--;
   return o;
@@ -2377,8 +2452,8 @@
   buildCounterUsage++;
   if (buildCounterUsage < 3) {
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
-    checkUnnamed1840(o.requirements);
-    checkUnnamed1841(o.rules);
+    checkUnnamed1838(o.requirements);
+    checkUnnamed1839(o.rules);
   }
   buildCounterUsage--;
 }
@@ -2406,14 +2481,14 @@
   buildCounterUsageRule--;
 }
 
-buildUnnamed1842() {
+buildUnnamed1840() {
   var o = new core.List<api.VisibilityRule>();
   o.add(buildVisibilityRule());
   o.add(buildVisibilityRule());
   return o;
 }
 
-checkUnnamed1842(core.List<api.VisibilityRule> o) {
+checkUnnamed1840(core.List<api.VisibilityRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVisibilityRule(o[0]);
   checkVisibilityRule(o[1]);
@@ -2424,7 +2499,7 @@
   var o = new api.Visibility();
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    o.rules = buildUnnamed1842();
+    o.rules = buildUnnamed1840();
   }
   buildCounterVisibility--;
   return o;
@@ -2433,7 +2508,7 @@
 checkVisibility(api.Visibility o) {
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
-    checkUnnamed1842(o.rules);
+    checkUnnamed1840(o.rules);
   }
   buildCounterVisibility--;
 }
@@ -2459,7 +2534,6 @@
   buildCounterVisibilityRule--;
 }
 
-
 main() {
   unittest.group("obj-schema-Api", () {
     unittest.test("to-json--from-json", () {
@@ -2469,7 +2543,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthProvider", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthProvider();
@@ -2478,7 +2551,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthRequirement", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthRequirement();
@@ -2487,7 +2559,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Authentication", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthentication();
@@ -2496,7 +2567,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthenticationRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthenticationRule();
@@ -2505,7 +2575,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthorizationConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthorizationConfig();
@@ -2514,7 +2583,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuthorizationRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuthorizationRule();
@@ -2523,7 +2591,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Backend", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackend();
@@ -2532,7 +2599,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BackendRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildBackendRule();
@@ -2541,7 +2607,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Context", () {
     unittest.test("to-json--from-json", () {
       var o = buildContext();
@@ -2550,7 +2615,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ContextRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildContextRule();
@@ -2559,7 +2623,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Control", () {
     unittest.test("to-json--from-json", () {
       var o = buildControl();
@@ -2568,7 +2631,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomAuthRequirements", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomAuthRequirements();
@@ -2577,7 +2639,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomError", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomError();
@@ -2586,7 +2647,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomErrorRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomErrorRule();
@@ -2595,7 +2655,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CustomHttpPattern", () {
     unittest.test("to-json--from-json", () {
       var o = buildCustomHttpPattern();
@@ -2604,7 +2663,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DisableServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDisableServiceRequest();
@@ -2613,7 +2671,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Documentation", () {
     unittest.test("to-json--from-json", () {
       var o = buildDocumentation();
@@ -2622,7 +2679,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DocumentationRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildDocumentationRule();
@@ -2631,7 +2687,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnableServiceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnableServiceRequest();
@@ -2640,7 +2695,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Endpoint", () {
     unittest.test("to-json--from-json", () {
       var o = buildEndpoint();
@@ -2649,7 +2703,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Enum", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnum();
@@ -2658,7 +2711,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EnumValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildEnumValue();
@@ -2667,7 +2719,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Experimental", () {
     unittest.test("to-json--from-json", () {
       var o = buildExperimental();
@@ -2676,7 +2727,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Field", () {
     unittest.test("to-json--from-json", () {
       var o = buildField();
@@ -2685,7 +2735,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Http", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttp();
@@ -2694,7 +2743,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpRule();
@@ -2703,7 +2751,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LabelDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildLabelDescriptor();
@@ -2712,7 +2759,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListEnabledServicesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListEnabledServicesResponse();
@@ -2721,7 +2767,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogDescriptor();
@@ -2730,7 +2775,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Logging", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogging();
@@ -2739,7 +2783,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LoggingDestination", () {
     unittest.test("to-json--from-json", () {
       var o = buildLoggingDestination();
@@ -2748,7 +2791,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MediaDownload", () {
     unittest.test("to-json--from-json", () {
       var o = buildMediaDownload();
@@ -2757,7 +2799,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MediaUpload", () {
     unittest.test("to-json--from-json", () {
       var o = buildMediaUpload();
@@ -2766,7 +2807,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Method", () {
     unittest.test("to-json--from-json", () {
       var o = buildMethod();
@@ -2775,7 +2815,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricDescriptor();
@@ -2784,7 +2823,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MetricRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildMetricRule();
@@ -2793,7 +2831,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Mixin", () {
     unittest.test("to-json--from-json", () {
       var o = buildMixin();
@@ -2802,7 +2839,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonitoredResourceDescriptor", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoredResourceDescriptor();
@@ -2811,7 +2847,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Monitoring", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoring();
@@ -2820,7 +2855,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonitoringDestination", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitoringDestination();
@@ -2829,7 +2863,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OAuthRequirements", () {
     unittest.test("to-json--from-json", () {
       var o = buildOAuthRequirements();
@@ -2838,7 +2871,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -2847,7 +2879,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OperationMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationMetadata();
@@ -2856,7 +2887,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Option", () {
     unittest.test("to-json--from-json", () {
       var o = buildOption();
@@ -2865,7 +2895,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Page", () {
     unittest.test("to-json--from-json", () {
       var o = buildPage();
@@ -2874,7 +2903,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PublishedService", () {
     unittest.test("to-json--from-json", () {
       var o = buildPublishedService();
@@ -2883,7 +2911,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Quota", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuota();
@@ -2892,7 +2919,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QuotaLimit", () {
     unittest.test("to-json--from-json", () {
       var o = buildQuotaLimit();
@@ -2901,7 +2927,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchServicesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchServicesResponse();
@@ -2910,7 +2935,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Service", () {
     unittest.test("to-json--from-json", () {
       var o = buildService();
@@ -2919,7 +2943,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceContext();
@@ -2928,7 +2951,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SourceInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildSourceInfo();
@@ -2937,7 +2959,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -2946,7 +2967,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Step", () {
     unittest.test("to-json--from-json", () {
       var o = buildStep();
@@ -2955,7 +2975,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemParameter", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemParameter();
@@ -2964,7 +2983,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemParameterRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemParameterRule();
@@ -2973,7 +2991,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SystemParameters", () {
     unittest.test("to-json--from-json", () {
       var o = buildSystemParameters();
@@ -2982,7 +2999,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Type", () {
     unittest.test("to-json--from-json", () {
       var o = buildType();
@@ -2991,7 +3007,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Usage", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsage();
@@ -3000,7 +3015,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UsageRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildUsageRule();
@@ -3009,7 +3023,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Visibility", () {
     unittest.test("to-json--from-json", () {
       var o = buildVisibility();
@@ -3018,7 +3031,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VisibilityRule", () {
     unittest.test("to-json--from-json", () {
       var o = buildVisibilityRule();
@@ -3027,12 +3039,11 @@
     });
   });
 
-
   unittest.group("resource-ProjectsServicesResourceApi", () {
     unittest.test("method--disable", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsServicesResourceApi res = new api.ServiceuserApi(mock).projects.services;
+      api.ProjectsServicesResourceApi res =
+          new api.ServiceuserApi(mock).projects.services;
       var arg_request = buildDisableServiceRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3043,9 +3054,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3059,29 +3072,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.disable(arg_request, arg_name).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .disable(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--enable", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsServicesResourceApi res = new api.ServiceuserApi(mock).projects.services;
+      api.ProjectsServicesResourceApi res =
+          new api.ServiceuserApi(mock).projects.services;
       var arg_request = buildEnableServiceRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3092,9 +3108,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3108,40 +3126,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.enable(arg_request, arg_name).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .enable(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsServicesResourceApi res = new api.ServiceuserApi(mock).projects.services;
+      api.ProjectsServicesResourceApi res =
+          new api.ServiceuserApi(mock).projects.services;
       var arg_parent = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
+      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3155,33 +3178,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListEnabledServicesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListEnabledServicesResponse response) {
+      res
+          .list(arg_parent, pageSize: arg_pageSize, pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.ListEnabledServicesResponse response) {
         checkListEnabledServicesResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ServicesResourceApi", () {
     unittest.test("method--search", () {
-
       var mock = new HttpServerMock();
       api.ServicesResourceApi res = new api.ServiceuserApi(mock).services;
       var arg_pageToken = "foo";
@@ -3191,9 +3217,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/services:search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/services:search"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -3206,29 +3234,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchServicesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.search(pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.SearchServicesResponse response) {
+      res
+          .search(pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.SearchServicesResponse response) {
         checkSearchServicesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index b722b4b..1123362 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.siteVerification.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/siteverification/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -63,7 +62,8 @@
   return o;
 }
 
-checkSiteVerificationWebResourceGettokenRequestSite(api.SiteVerificationWebResourceGettokenRequestSite o) {
+checkSiteVerificationWebResourceGettokenRequestSite(
+    api.SiteVerificationWebResourceGettokenRequestSite o) {
   buildCounterSiteVerificationWebResourceGettokenRequestSite++;
   if (buildCounterSiteVerificationWebResourceGettokenRequestSite < 3) {
     unittest.expect(o.identifier, unittest.equals('foo'));
@@ -84,7 +84,8 @@
   return o;
 }
 
-checkSiteVerificationWebResourceGettokenRequest(api.SiteVerificationWebResourceGettokenRequest o) {
+checkSiteVerificationWebResourceGettokenRequest(
+    api.SiteVerificationWebResourceGettokenRequest o) {
   buildCounterSiteVerificationWebResourceGettokenRequest++;
   if (buildCounterSiteVerificationWebResourceGettokenRequest < 3) {
     checkSiteVerificationWebResourceGettokenRequestSite(o.site);
@@ -105,7 +106,8 @@
   return o;
 }
 
-checkSiteVerificationWebResourceGettokenResponse(api.SiteVerificationWebResourceGettokenResponse o) {
+checkSiteVerificationWebResourceGettokenResponse(
+    api.SiteVerificationWebResourceGettokenResponse o) {
   buildCounterSiteVerificationWebResourceGettokenResponse++;
   if (buildCounterSiteVerificationWebResourceGettokenResponse < 3) {
     unittest.expect(o.method, unittest.equals('foo'));
@@ -114,14 +116,14 @@
   buildCounterSiteVerificationWebResourceGettokenResponse--;
 }
 
-buildUnnamed166() {
+buildUnnamed161() {
   var o = new core.List<api.SiteVerificationWebResourceResource>();
   o.add(buildSiteVerificationWebResourceResource());
   o.add(buildSiteVerificationWebResourceResource());
   return o;
 }
 
-checkUnnamed166(core.List<api.SiteVerificationWebResourceResource> o) {
+checkUnnamed161(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteVerificationWebResourceResource(o[0]);
   checkSiteVerificationWebResourceResource(o[1]);
@@ -132,28 +134,29 @@
   var o = new api.SiteVerificationWebResourceListResponse();
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    o.items = buildUnnamed166();
+    o.items = buildUnnamed161();
   }
   buildCounterSiteVerificationWebResourceListResponse--;
   return o;
 }
 
-checkSiteVerificationWebResourceListResponse(api.SiteVerificationWebResourceListResponse o) {
+checkSiteVerificationWebResourceListResponse(
+    api.SiteVerificationWebResourceListResponse o) {
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    checkUnnamed166(o.items);
+    checkUnnamed161(o.items);
   }
   buildCounterSiteVerificationWebResourceListResponse--;
 }
 
-buildUnnamed167() {
+buildUnnamed162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed167(core.List<core.String> o) {
+checkUnnamed162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -171,7 +174,8 @@
   return o;
 }
 
-checkSiteVerificationWebResourceResourceSite(api.SiteVerificationWebResourceResourceSite o) {
+checkSiteVerificationWebResourceResourceSite(
+    api.SiteVerificationWebResourceResourceSite o) {
   buildCounterSiteVerificationWebResourceResourceSite++;
   if (buildCounterSiteVerificationWebResourceResourceSite < 3) {
     unittest.expect(o.identifier, unittest.equals('foo'));
@@ -186,70 +190,71 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     o.id = "foo";
-    o.owners = buildUnnamed167();
+    o.owners = buildUnnamed162();
     o.site = buildSiteVerificationWebResourceResourceSite();
   }
   buildCounterSiteVerificationWebResourceResource--;
   return o;
 }
 
-checkSiteVerificationWebResourceResource(api.SiteVerificationWebResourceResource o) {
+checkSiteVerificationWebResourceResource(
+    api.SiteVerificationWebResourceResource o) {
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed167(o.owners);
+    checkUnnamed162(o.owners);
     checkSiteVerificationWebResourceResourceSite(o.site);
   }
   buildCounterSiteVerificationWebResourceResource--;
 }
 
-
 main() {
-  unittest.group("obj-schema-SiteVerificationWebResourceGettokenRequestSite", () {
+  unittest.group("obj-schema-SiteVerificationWebResourceGettokenRequestSite",
+      () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteVerificationWebResourceGettokenRequestSite();
-      var od = new api.SiteVerificationWebResourceGettokenRequestSite.fromJson(o.toJson());
+      var od = new api.SiteVerificationWebResourceGettokenRequestSite.fromJson(
+          o.toJson());
       checkSiteVerificationWebResourceGettokenRequestSite(od);
     });
   });
 
-
   unittest.group("obj-schema-SiteVerificationWebResourceGettokenRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteVerificationWebResourceGettokenRequest();
-      var od = new api.SiteVerificationWebResourceGettokenRequest.fromJson(o.toJson());
+      var od = new api.SiteVerificationWebResourceGettokenRequest.fromJson(
+          o.toJson());
       checkSiteVerificationWebResourceGettokenRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-SiteVerificationWebResourceGettokenResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteVerificationWebResourceGettokenResponse();
-      var od = new api.SiteVerificationWebResourceGettokenResponse.fromJson(o.toJson());
+      var od = new api.SiteVerificationWebResourceGettokenResponse.fromJson(
+          o.toJson());
       checkSiteVerificationWebResourceGettokenResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-SiteVerificationWebResourceListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteVerificationWebResourceListResponse();
-      var od = new api.SiteVerificationWebResourceListResponse.fromJson(o.toJson());
+      var od =
+          new api.SiteVerificationWebResourceListResponse.fromJson(o.toJson());
       checkSiteVerificationWebResourceListResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-SiteVerificationWebResourceResourceSite", () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteVerificationWebResourceResourceSite();
-      var od = new api.SiteVerificationWebResourceResourceSite.fromJson(o.toJson());
+      var od =
+          new api.SiteVerificationWebResourceResourceSite.fromJson(o.toJson());
       checkSiteVerificationWebResourceResourceSite(od);
     });
   });
 
-
   unittest.group("obj-schema-SiteVerificationWebResourceResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildSiteVerificationWebResourceResource();
@@ -258,23 +263,25 @@
     });
   });
 
-
   unittest.group("resource-WebResourceResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -290,16 +297,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -308,20 +316,23 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -337,43 +348,50 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSiteVerificationWebResourceResource());
+        var resp =
+            convert.JSON.encode(buildSiteVerificationWebResourceResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_id).then(unittest.expectAsync1(((api.SiteVerificationWebResourceResource response) {
+      res.get(arg_id).then(unittest
+          .expectAsync1(((api.SiteVerificationWebResourceResource response) {
         checkSiteVerificationWebResourceResource(response);
       })));
     });
 
     unittest.test("method--getToken", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       var arg_request = buildSiteVerificationWebResourceGettokenRequest();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = new api.SiteVerificationWebResourceGettokenRequest.fromJson(json);
+        var obj =
+            new api.SiteVerificationWebResourceGettokenRequest.fromJson(json);
         checkSiteVerificationWebResourceGettokenRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("token"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("token"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -386,29 +404,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSiteVerificationWebResourceGettokenResponse());
+        var resp = convert.JSON
+            .encode(buildSiteVerificationWebResourceGettokenResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getToken(arg_request).then(unittest.expectAsync1(((api.SiteVerificationWebResourceGettokenResponse response) {
+      res.getToken(arg_request).then(unittest.expectAsync1(
+          ((api.SiteVerificationWebResourceGettokenResponse response) {
         checkSiteVerificationWebResourceGettokenResponse(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       var arg_request = buildSiteVerificationWebResourceResource();
       var arg_verificationMethod = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -419,11 +440,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("webResource"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("webResource"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -436,40 +460,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["verificationMethod"].first, unittest.equals(arg_verificationMethod));
-
+        unittest.expect(queryMap["verificationMethod"].first,
+            unittest.equals(arg_verificationMethod));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSiteVerificationWebResourceResource());
+        var resp =
+            convert.JSON.encode(buildSiteVerificationWebResourceResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_verificationMethod).then(unittest.expectAsync1(((api.SiteVerificationWebResourceResource response) {
+      res.insert(arg_request, arg_verificationMethod).then(unittest
+          .expectAsync1(((api.SiteVerificationWebResourceResource response) {
         checkSiteVerificationWebResourceResource(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("webResource"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("webResource"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -482,29 +513,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSiteVerificationWebResourceListResponse());
+        var resp =
+            convert.JSON.encode(buildSiteVerificationWebResourceListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list().then(unittest.expectAsync1(((api.SiteVerificationWebResourceListResponse response) {
+      res.list().then(unittest.expectAsync1(
+          ((api.SiteVerificationWebResourceListResponse response) {
         checkSiteVerificationWebResourceListResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       var arg_request = buildSiteVerificationWebResourceResource();
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -515,11 +549,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -535,29 +572,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSiteVerificationWebResourceResource());
+        var resp =
+            convert.JSON.encode(buildSiteVerificationWebResourceResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_id).then(unittest.expectAsync1(((api.SiteVerificationWebResourceResource response) {
+      res.patch(arg_request, arg_id).then(unittest
+          .expectAsync1(((api.SiteVerificationWebResourceResource response) {
         checkSiteVerificationWebResourceResource(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.WebResourceResourceApi res = new api.SiteVerificationApi(mock).webResource;
+      api.WebResourceResourceApi res =
+          new api.SiteVerificationApi(mock).webResource;
       var arg_request = buildSiteVerificationWebResourceResource();
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -568,11 +608,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 20),
+            unittest.equals("siteVerification/v1/"));
         pathOffset += 20;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -588,27 +631,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSiteVerificationWebResourceResource());
+        var resp =
+            convert.JSON.encode(buildSiteVerificationWebResourceResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_id).then(unittest.expectAsync1(((api.SiteVerificationWebResourceResource response) {
+      res.update(arg_request, arg_id).then(unittest
+          .expectAsync1(((api.SiteVerificationWebResourceResource response) {
         checkSiteVerificationWebResourceResource(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/slides/v1_test.dart b/generated/googleapis/test/slides/v1_test.dart
index 24bba41..140cb4b 100644
--- a/generated/googleapis/test/slides/v1_test.dart
+++ b/generated/googleapis/test/slides/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.slides.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/slides/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -105,14 +104,14 @@
   buildCounterAutoText--;
 }
 
-buildUnnamed1730() {
+buildUnnamed1728() {
   var o = new core.List<api.Request>();
   o.add(buildRequest());
   o.add(buildRequest());
   return o;
 }
 
-checkUnnamed1730(core.List<api.Request> o) {
+checkUnnamed1728(core.List<api.Request> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRequest(o[0]);
   checkRequest(o[1]);
@@ -123,7 +122,7 @@
   var o = new api.BatchUpdatePresentationRequest();
   buildCounterBatchUpdatePresentationRequest++;
   if (buildCounterBatchUpdatePresentationRequest < 3) {
-    o.requests = buildUnnamed1730();
+    o.requests = buildUnnamed1728();
     o.writeControl = buildWriteControl();
   }
   buildCounterBatchUpdatePresentationRequest--;
@@ -133,20 +132,20 @@
 checkBatchUpdatePresentationRequest(api.BatchUpdatePresentationRequest o) {
   buildCounterBatchUpdatePresentationRequest++;
   if (buildCounterBatchUpdatePresentationRequest < 3) {
-    checkUnnamed1730(o.requests);
+    checkUnnamed1728(o.requests);
     checkWriteControl(o.writeControl);
   }
   buildCounterBatchUpdatePresentationRequest--;
 }
 
-buildUnnamed1731() {
+buildUnnamed1729() {
   var o = new core.List<api.Response>();
   o.add(buildResponse());
   o.add(buildResponse());
   return o;
 }
 
-checkUnnamed1731(core.List<api.Response> o) {
+checkUnnamed1729(core.List<api.Response> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResponse(o[0]);
   checkResponse(o[1]);
@@ -158,7 +157,7 @@
   buildCounterBatchUpdatePresentationResponse++;
   if (buildCounterBatchUpdatePresentationResponse < 3) {
     o.presentationId = "foo";
-    o.replies = buildUnnamed1731();
+    o.replies = buildUnnamed1729();
   }
   buildCounterBatchUpdatePresentationResponse--;
   return o;
@@ -168,7 +167,7 @@
   buildCounterBatchUpdatePresentationResponse++;
   if (buildCounterBatchUpdatePresentationResponse < 3) {
     unittest.expect(o.presentationId, unittest.equals('foo'));
-    checkUnnamed1731(o.replies);
+    checkUnnamed1729(o.replies);
   }
   buildCounterBatchUpdatePresentationResponse--;
 }
@@ -198,14 +197,14 @@
   buildCounterBullet--;
 }
 
-buildUnnamed1732() {
+buildUnnamed1730() {
   var o = new core.List<api.ThemeColorPair>();
   o.add(buildThemeColorPair());
   o.add(buildThemeColorPair());
   return o;
 }
 
-checkUnnamed1732(core.List<api.ThemeColorPair> o) {
+checkUnnamed1730(core.List<api.ThemeColorPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThemeColorPair(o[0]);
   checkThemeColorPair(o[1]);
@@ -216,7 +215,7 @@
   var o = new api.ColorScheme();
   buildCounterColorScheme++;
   if (buildCounterColorScheme < 3) {
-    o.colors = buildUnnamed1732();
+    o.colors = buildUnnamed1730();
   }
   buildCounterColorScheme--;
   return o;
@@ -225,7 +224,7 @@
 checkColorScheme(api.ColorScheme o) {
   buildCounterColorScheme++;
   if (buildCounterColorScheme < 3) {
-    checkUnnamed1732(o.colors);
+    checkUnnamed1730(o.colors);
   }
   buildCounterColorScheme--;
 }
@@ -450,14 +449,14 @@
   buildCounterCreateSheetsChartResponse--;
 }
 
-buildUnnamed1733() {
+buildUnnamed1731() {
   var o = new core.List<api.LayoutPlaceholderIdMapping>();
   o.add(buildLayoutPlaceholderIdMapping());
   o.add(buildLayoutPlaceholderIdMapping());
   return o;
 }
 
-checkUnnamed1733(core.List<api.LayoutPlaceholderIdMapping> o) {
+checkUnnamed1731(core.List<api.LayoutPlaceholderIdMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayoutPlaceholderIdMapping(o[0]);
   checkLayoutPlaceholderIdMapping(o[1]);
@@ -470,7 +469,7 @@
   if (buildCounterCreateSlideRequest < 3) {
     o.insertionIndex = 42;
     o.objectId = "foo";
-    o.placeholderIdMappings = buildUnnamed1733();
+    o.placeholderIdMappings = buildUnnamed1731();
     o.slideLayoutReference = buildLayoutReference();
   }
   buildCounterCreateSlideRequest--;
@@ -482,7 +481,7 @@
   if (buildCounterCreateSlideRequest < 3) {
     unittest.expect(o.insertionIndex, unittest.equals(42));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1733(o.placeholderIdMappings);
+    checkUnnamed1731(o.placeholderIdMappings);
     checkLayoutReference(o.slideLayoutReference);
   }
   buildCounterCreateSlideRequest--;
@@ -750,14 +749,14 @@
   buildCounterDimension--;
 }
 
-buildUnnamed1734() {
+buildUnnamed1732() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1734(core.Map<core.String, core.String> o) {
+checkUnnamed1732(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -769,7 +768,7 @@
   buildCounterDuplicateObjectRequest++;
   if (buildCounterDuplicateObjectRequest < 3) {
     o.objectId = "foo";
-    o.objectIds = buildUnnamed1734();
+    o.objectIds = buildUnnamed1732();
   }
   buildCounterDuplicateObjectRequest--;
   return o;
@@ -779,7 +778,7 @@
   buildCounterDuplicateObjectRequest++;
   if (buildCounterDuplicateObjectRequest < 3) {
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1734(o.objectIds);
+    checkUnnamed1732(o.objectIds);
   }
   buildCounterDuplicateObjectRequest--;
 }
@@ -803,14 +802,14 @@
   buildCounterDuplicateObjectResponse--;
 }
 
-buildUnnamed1735() {
+buildUnnamed1733() {
   var o = new core.List<api.PageElement>();
   o.add(buildPageElement());
   o.add(buildPageElement());
   return o;
 }
 
-checkUnnamed1735(core.List<api.PageElement> o) {
+checkUnnamed1733(core.List<api.PageElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageElement(o[0]);
   checkPageElement(o[1]);
@@ -821,7 +820,7 @@
   var o = new api.Group();
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
-    o.children = buildUnnamed1735();
+    o.children = buildUnnamed1733();
   }
   buildCounterGroup--;
   return o;
@@ -830,7 +829,7 @@
 checkGroup(api.Group o) {
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
-    checkUnnamed1735(o.children);
+    checkUnnamed1733(o.children);
   }
   buildCounterGroup--;
 }
@@ -1125,14 +1124,14 @@
   buildCounterLink--;
 }
 
-buildUnnamed1736() {
+buildUnnamed1734() {
   var o = new core.Map<core.String, api.NestingLevel>();
   o["x"] = buildNestingLevel();
   o["y"] = buildNestingLevel();
   return o;
 }
 
-checkUnnamed1736(core.Map<core.String, api.NestingLevel> o) {
+checkUnnamed1734(core.Map<core.String, api.NestingLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNestingLevel(o["x"]);
   checkNestingLevel(o["y"]);
@@ -1144,7 +1143,7 @@
   buildCounterList++;
   if (buildCounterList < 3) {
     o.listId = "foo";
-    o.nestingLevel = buildUnnamed1736();
+    o.nestingLevel = buildUnnamed1734();
   }
   buildCounterList--;
   return o;
@@ -1154,7 +1153,7 @@
   buildCounterList++;
   if (buildCounterList < 3) {
     unittest.expect(o.listId, unittest.equals('foo'));
-    checkUnnamed1736(o.nestingLevel);
+    checkUnnamed1734(o.nestingLevel);
   }
   buildCounterList--;
 }
@@ -1300,14 +1299,14 @@
   buildCounterOutlineFill--;
 }
 
-buildUnnamed1737() {
+buildUnnamed1735() {
   var o = new core.List<api.PageElement>();
   o.add(buildPageElement());
   o.add(buildPageElement());
   return o;
 }
 
-checkUnnamed1737(core.List<api.PageElement> o) {
+checkUnnamed1735(core.List<api.PageElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageElement(o[0]);
   checkPageElement(o[1]);
@@ -1322,7 +1321,7 @@
     o.masterProperties = buildMasterProperties();
     o.notesProperties = buildNotesProperties();
     o.objectId = "foo";
-    o.pageElements = buildUnnamed1737();
+    o.pageElements = buildUnnamed1735();
     o.pageProperties = buildPageProperties();
     o.pageType = "foo";
     o.revisionId = "foo";
@@ -1339,7 +1338,7 @@
     checkMasterProperties(o.masterProperties);
     checkNotesProperties(o.notesProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkUnnamed1737(o.pageElements);
+    checkUnnamed1735(o.pageElements);
     checkPageProperties(o.pageProperties);
     unittest.expect(o.pageType, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
@@ -1537,6 +1536,32 @@
   buildCounterPlaceholder--;
 }
 
+buildUnnamed1736() {
+  var o = new core.List<api.Page>();
+  o.add(buildPage());
+  o.add(buildPage());
+  return o;
+}
+
+checkUnnamed1736(core.List<api.Page> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPage(o[0]);
+  checkPage(o[1]);
+}
+
+buildUnnamed1737() {
+  var o = new core.List<api.Page>();
+  o.add(buildPage());
+  o.add(buildPage());
+  return o;
+}
+
+checkUnnamed1737(core.List<api.Page> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPage(o[0]);
+  checkPage(o[1]);
+}
+
 buildUnnamed1738() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
@@ -1550,45 +1575,19 @@
   checkPage(o[1]);
 }
 
-buildUnnamed1739() {
-  var o = new core.List<api.Page>();
-  o.add(buildPage());
-  o.add(buildPage());
-  return o;
-}
-
-checkUnnamed1739(core.List<api.Page> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
-}
-
-buildUnnamed1740() {
-  var o = new core.List<api.Page>();
-  o.add(buildPage());
-  o.add(buildPage());
-  return o;
-}
-
-checkUnnamed1740(core.List<api.Page> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
-}
-
 core.int buildCounterPresentation = 0;
 buildPresentation() {
   var o = new api.Presentation();
   buildCounterPresentation++;
   if (buildCounterPresentation < 3) {
-    o.layouts = buildUnnamed1738();
+    o.layouts = buildUnnamed1736();
     o.locale = "foo";
-    o.masters = buildUnnamed1739();
+    o.masters = buildUnnamed1737();
     o.notesMaster = buildPage();
     o.pageSize = buildSize();
     o.presentationId = "foo";
     o.revisionId = "foo";
-    o.slides = buildUnnamed1740();
+    o.slides = buildUnnamed1738();
     o.title = "foo";
   }
   buildCounterPresentation--;
@@ -1598,14 +1597,14 @@
 checkPresentation(api.Presentation o) {
   buildCounterPresentation++;
   if (buildCounterPresentation < 3) {
-    checkUnnamed1738(o.layouts);
+    checkUnnamed1736(o.layouts);
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1739(o.masters);
+    checkUnnamed1737(o.masters);
     checkPage(o.notesMaster);
     checkSize(o.pageSize);
     unittest.expect(o.presentationId, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
-    checkUnnamed1740(o.slides);
+    checkUnnamed1738(o.slides);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterPresentation--;
@@ -1634,14 +1633,14 @@
   buildCounterRange--;
 }
 
-buildUnnamed1741() {
+buildUnnamed1739() {
   var o = new core.List<api.ColorStop>();
   o.add(buildColorStop());
   o.add(buildColorStop());
   return o;
 }
 
-checkUnnamed1741(core.List<api.ColorStop> o) {
+checkUnnamed1739(core.List<api.ColorStop> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorStop(o[0]);
   checkColorStop(o[1]);
@@ -1653,7 +1652,7 @@
   buildCounterRecolor++;
   if (buildCounterRecolor < 3) {
     o.name = "foo";
-    o.recolorStops = buildUnnamed1741();
+    o.recolorStops = buildUnnamed1739();
   }
   buildCounterRecolor--;
   return o;
@@ -1663,7 +1662,7 @@
   buildCounterRecolor++;
   if (buildCounterRecolor < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1741(o.recolorStops);
+    checkUnnamed1739(o.recolorStops);
   }
   buildCounterRecolor--;
 }
@@ -1687,14 +1686,14 @@
   buildCounterRefreshSheetsChartRequest--;
 }
 
-buildUnnamed1742() {
+buildUnnamed1740() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1742(core.List<core.String> o) {
+checkUnnamed1740(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1707,7 +1706,7 @@
   if (buildCounterReplaceAllShapesWithImageRequest < 3) {
     o.containsText = buildSubstringMatchCriteria();
     o.imageUrl = "foo";
-    o.pageObjectIds = buildUnnamed1742();
+    o.pageObjectIds = buildUnnamed1740();
     o.replaceMethod = "foo";
   }
   buildCounterReplaceAllShapesWithImageRequest--;
@@ -1719,7 +1718,7 @@
   if (buildCounterReplaceAllShapesWithImageRequest < 3) {
     checkSubstringMatchCriteria(o.containsText);
     unittest.expect(o.imageUrl, unittest.equals('foo'));
-    checkUnnamed1742(o.pageObjectIds);
+    checkUnnamed1740(o.pageObjectIds);
     unittest.expect(o.replaceMethod, unittest.equals('foo'));
   }
   buildCounterReplaceAllShapesWithImageRequest--;
@@ -1736,7 +1735,8 @@
   return o;
 }
 
-checkReplaceAllShapesWithImageResponse(api.ReplaceAllShapesWithImageResponse o) {
+checkReplaceAllShapesWithImageResponse(
+    api.ReplaceAllShapesWithImageResponse o) {
   buildCounterReplaceAllShapesWithImageResponse++;
   if (buildCounterReplaceAllShapesWithImageResponse < 3) {
     unittest.expect(o.occurrencesChanged, unittest.equals(42));
@@ -1744,14 +1744,14 @@
   buildCounterReplaceAllShapesWithImageResponse--;
 }
 
-buildUnnamed1743() {
+buildUnnamed1741() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1743(core.List<core.String> o) {
+checkUnnamed1741(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1765,20 +1765,21 @@
     o.chartId = 42;
     o.containsText = buildSubstringMatchCriteria();
     o.linkingMode = "foo";
-    o.pageObjectIds = buildUnnamed1743();
+    o.pageObjectIds = buildUnnamed1741();
     o.spreadsheetId = "foo";
   }
   buildCounterReplaceAllShapesWithSheetsChartRequest--;
   return o;
 }
 
-checkReplaceAllShapesWithSheetsChartRequest(api.ReplaceAllShapesWithSheetsChartRequest o) {
+checkReplaceAllShapesWithSheetsChartRequest(
+    api.ReplaceAllShapesWithSheetsChartRequest o) {
   buildCounterReplaceAllShapesWithSheetsChartRequest++;
   if (buildCounterReplaceAllShapesWithSheetsChartRequest < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
     checkSubstringMatchCriteria(o.containsText);
     unittest.expect(o.linkingMode, unittest.equals('foo'));
-    checkUnnamed1743(o.pageObjectIds);
+    checkUnnamed1741(o.pageObjectIds);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
   }
   buildCounterReplaceAllShapesWithSheetsChartRequest--;
@@ -1795,7 +1796,8 @@
   return o;
 }
 
-checkReplaceAllShapesWithSheetsChartResponse(api.ReplaceAllShapesWithSheetsChartResponse o) {
+checkReplaceAllShapesWithSheetsChartResponse(
+    api.ReplaceAllShapesWithSheetsChartResponse o) {
   buildCounterReplaceAllShapesWithSheetsChartResponse++;
   if (buildCounterReplaceAllShapesWithSheetsChartResponse < 3) {
     unittest.expect(o.occurrencesChanged, unittest.equals(42));
@@ -1803,14 +1805,14 @@
   buildCounterReplaceAllShapesWithSheetsChartResponse--;
 }
 
-buildUnnamed1744() {
+buildUnnamed1742() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1744(core.List<core.String> o) {
+checkUnnamed1742(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1822,7 +1824,7 @@
   buildCounterReplaceAllTextRequest++;
   if (buildCounterReplaceAllTextRequest < 3) {
     o.containsText = buildSubstringMatchCriteria();
-    o.pageObjectIds = buildUnnamed1744();
+    o.pageObjectIds = buildUnnamed1742();
     o.replaceText = "foo";
   }
   buildCounterReplaceAllTextRequest--;
@@ -1833,7 +1835,7 @@
   buildCounterReplaceAllTextRequest++;
   if (buildCounterReplaceAllTextRequest < 3) {
     checkSubstringMatchCriteria(o.containsText);
-    checkUnnamed1744(o.pageObjectIds);
+    checkUnnamed1742(o.pageObjectIds);
     unittest.expect(o.replaceText, unittest.equals('foo'));
   }
   buildCounterReplaceAllTextRequest--;
@@ -1882,7 +1884,8 @@
     o.insertText = buildInsertTextRequest();
     o.refreshSheetsChart = buildRefreshSheetsChartRequest();
     o.replaceAllShapesWithImage = buildReplaceAllShapesWithImageRequest();
-    o.replaceAllShapesWithSheetsChart = buildReplaceAllShapesWithSheetsChartRequest();
+    o.replaceAllShapesWithSheetsChart =
+        buildReplaceAllShapesWithSheetsChartRequest();
     o.replaceAllText = buildReplaceAllTextRequest();
     o.updateImageProperties = buildUpdateImagePropertiesRequest();
     o.updateLineProperties = buildUpdateLinePropertiesRequest();
@@ -1921,7 +1924,8 @@
     checkInsertTextRequest(o.insertText);
     checkRefreshSheetsChartRequest(o.refreshSheetsChart);
     checkReplaceAllShapesWithImageRequest(o.replaceAllShapesWithImage);
-    checkReplaceAllShapesWithSheetsChartRequest(o.replaceAllShapesWithSheetsChart);
+    checkReplaceAllShapesWithSheetsChartRequest(
+        o.replaceAllShapesWithSheetsChart);
     checkReplaceAllTextRequest(o.replaceAllText);
     checkUpdateImagePropertiesRequest(o.updateImageProperties);
     checkUpdateLinePropertiesRequest(o.updateLineProperties);
@@ -1951,7 +1955,8 @@
     o.createVideo = buildCreateVideoResponse();
     o.duplicateObject = buildDuplicateObjectResponse();
     o.replaceAllShapesWithImage = buildReplaceAllShapesWithImageResponse();
-    o.replaceAllShapesWithSheetsChart = buildReplaceAllShapesWithSheetsChartResponse();
+    o.replaceAllShapesWithSheetsChart =
+        buildReplaceAllShapesWithSheetsChartResponse();
     o.replaceAllText = buildReplaceAllTextResponse();
   }
   buildCounterResponse--;
@@ -1970,7 +1975,8 @@
     checkCreateVideoResponse(o.createVideo);
     checkDuplicateObjectResponse(o.duplicateObject);
     checkReplaceAllShapesWithImageResponse(o.replaceAllShapesWithImage);
-    checkReplaceAllShapesWithSheetsChartResponse(o.replaceAllShapesWithSheetsChart);
+    checkReplaceAllShapesWithSheetsChartResponse(
+        o.replaceAllShapesWithSheetsChart);
     checkReplaceAllTextResponse(o.replaceAllText);
   }
   buildCounterResponse--;
@@ -2254,27 +2260,27 @@
   buildCounterSubstringMatchCriteria--;
 }
 
-buildUnnamed1745() {
+buildUnnamed1743() {
   var o = new core.List<api.TableColumnProperties>();
   o.add(buildTableColumnProperties());
   o.add(buildTableColumnProperties());
   return o;
 }
 
-checkUnnamed1745(core.List<api.TableColumnProperties> o) {
+checkUnnamed1743(core.List<api.TableColumnProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableColumnProperties(o[0]);
   checkTableColumnProperties(o[1]);
 }
 
-buildUnnamed1746() {
+buildUnnamed1744() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1746(core.List<api.TableRow> o) {
+checkUnnamed1744(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -2287,8 +2293,8 @@
   if (buildCounterTable < 3) {
     o.columns = 42;
     o.rows = 42;
-    o.tableColumns = buildUnnamed1745();
-    o.tableRows = buildUnnamed1746();
+    o.tableColumns = buildUnnamed1743();
+    o.tableRows = buildUnnamed1744();
   }
   buildCounterTable--;
   return o;
@@ -2299,8 +2305,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.columns, unittest.equals(42));
     unittest.expect(o.rows, unittest.equals(42));
-    checkUnnamed1745(o.tableColumns);
-    checkUnnamed1746(o.tableRows);
+    checkUnnamed1743(o.tableColumns);
+    checkUnnamed1744(o.tableRows);
   }
   buildCounterTable--;
 }
@@ -2435,14 +2441,14 @@
   buildCounterTableRange--;
 }
 
-buildUnnamed1747() {
+buildUnnamed1745() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed1747(core.List<api.TableCell> o) {
+checkUnnamed1745(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -2454,7 +2460,7 @@
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
     o.rowHeight = buildDimension();
-    o.tableCells = buildUnnamed1747();
+    o.tableCells = buildUnnamed1745();
   }
   buildCounterTableRow--;
   return o;
@@ -2464,32 +2470,32 @@
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
     checkDimension(o.rowHeight);
-    checkUnnamed1747(o.tableCells);
+    checkUnnamed1745(o.tableCells);
   }
   buildCounterTableRow--;
 }
 
-buildUnnamed1748() {
+buildUnnamed1746() {
   var o = new core.Map<core.String, api.List>();
   o["x"] = buildList();
   o["y"] = buildList();
   return o;
 }
 
-checkUnnamed1748(core.Map<core.String, api.List> o) {
+checkUnnamed1746(core.Map<core.String, api.List> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkList(o["x"]);
   checkList(o["y"]);
 }
 
-buildUnnamed1749() {
+buildUnnamed1747() {
   var o = new core.List<api.TextElement>();
   o.add(buildTextElement());
   o.add(buildTextElement());
   return o;
 }
 
-checkUnnamed1749(core.List<api.TextElement> o) {
+checkUnnamed1747(core.List<api.TextElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTextElement(o[0]);
   checkTextElement(o[1]);
@@ -2500,8 +2506,8 @@
   var o = new api.TextContent();
   buildCounterTextContent++;
   if (buildCounterTextContent < 3) {
-    o.lists = buildUnnamed1748();
-    o.textElements = buildUnnamed1749();
+    o.lists = buildUnnamed1746();
+    o.textElements = buildUnnamed1747();
   }
   buildCounterTextContent--;
   return o;
@@ -2510,8 +2516,8 @@
 checkTextContent(api.TextContent o) {
   buildCounterTextContent++;
   if (buildCounterTextContent < 3) {
-    checkUnnamed1748(o.lists);
-    checkUnnamed1749(o.textElements);
+    checkUnnamed1746(o.lists);
+    checkUnnamed1747(o.textElements);
   }
   buildCounterTextContent--;
 }
@@ -2708,7 +2714,8 @@
   return o;
 }
 
-checkUpdatePageElementTransformRequest(api.UpdatePageElementTransformRequest o) {
+checkUpdatePageElementTransformRequest(
+    api.UpdatePageElementTransformRequest o) {
   buildCounterUpdatePageElementTransformRequest++;
   if (buildCounterUpdatePageElementTransformRequest < 3) {
     unittest.expect(o.applyMode, unittest.equals('foo'));
@@ -2791,14 +2798,14 @@
   buildCounterUpdateShapePropertiesRequest--;
 }
 
-buildUnnamed1750() {
+buildUnnamed1748() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1750(core.List<core.String> o) {
+checkUnnamed1748(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2810,7 +2817,7 @@
   buildCounterUpdateSlidesPositionRequest++;
   if (buildCounterUpdateSlidesPositionRequest < 3) {
     o.insertionIndex = 42;
-    o.slideObjectIds = buildUnnamed1750();
+    o.slideObjectIds = buildUnnamed1748();
   }
   buildCounterUpdateSlidesPositionRequest--;
   return o;
@@ -2820,7 +2827,7 @@
   buildCounterUpdateSlidesPositionRequest++;
   if (buildCounterUpdateSlidesPositionRequest < 3) {
     unittest.expect(o.insertionIndex, unittest.equals(42));
-    checkUnnamed1750(o.slideObjectIds);
+    checkUnnamed1748(o.slideObjectIds);
   }
   buildCounterUpdateSlidesPositionRequest--;
 }
@@ -3003,7 +3010,6 @@
   buildCounterWriteControl--;
 }
 
-
 main() {
   unittest.group("obj-schema-AffineTransform", () {
     unittest.test("to-json--from-json", () {
@@ -3013,7 +3019,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AutoText", () {
     unittest.test("to-json--from-json", () {
       var o = buildAutoText();
@@ -3022,7 +3027,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchUpdatePresentationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchUpdatePresentationRequest();
@@ -3031,7 +3035,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchUpdatePresentationResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchUpdatePresentationResponse();
@@ -3040,7 +3043,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Bullet", () {
     unittest.test("to-json--from-json", () {
       var o = buildBullet();
@@ -3049,7 +3051,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColorScheme", () {
     unittest.test("to-json--from-json", () {
       var o = buildColorScheme();
@@ -3058,7 +3059,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColorStop", () {
     unittest.test("to-json--from-json", () {
       var o = buildColorStop();
@@ -3067,7 +3067,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateImageRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateImageRequest();
@@ -3076,7 +3075,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateImageResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateImageResponse();
@@ -3085,7 +3083,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateLineRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateLineRequest();
@@ -3094,7 +3091,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateLineResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateLineResponse();
@@ -3103,7 +3099,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateParagraphBulletsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateParagraphBulletsRequest();
@@ -3112,7 +3107,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateShapeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateShapeRequest();
@@ -3121,7 +3115,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateShapeResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateShapeResponse();
@@ -3130,7 +3123,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateSheetsChartRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateSheetsChartRequest();
@@ -3139,7 +3131,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateSheetsChartResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateSheetsChartResponse();
@@ -3148,7 +3139,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateSlideRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateSlideRequest();
@@ -3157,7 +3147,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateSlideResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateSlideResponse();
@@ -3166,7 +3155,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateTableRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateTableRequest();
@@ -3175,7 +3163,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateTableResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateTableResponse();
@@ -3184,7 +3171,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateVideoRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateVideoRequest();
@@ -3193,7 +3179,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateVideoResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateVideoResponse();
@@ -3202,7 +3187,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CropProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildCropProperties();
@@ -3211,7 +3195,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeleteObjectRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteObjectRequest();
@@ -3220,7 +3203,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeleteParagraphBulletsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteParagraphBulletsRequest();
@@ -3229,7 +3211,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeleteTableColumnRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteTableColumnRequest();
@@ -3238,7 +3219,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeleteTableRowRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteTableRowRequest();
@@ -3247,7 +3227,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DeleteTextRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDeleteTextRequest();
@@ -3256,7 +3235,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Dimension", () {
     unittest.test("to-json--from-json", () {
       var o = buildDimension();
@@ -3265,7 +3243,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DuplicateObjectRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildDuplicateObjectRequest();
@@ -3274,7 +3251,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DuplicateObjectResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildDuplicateObjectResponse();
@@ -3283,7 +3259,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Group", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroup();
@@ -3292,7 +3267,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Image", () {
     unittest.test("to-json--from-json", () {
       var o = buildImage();
@@ -3301,7 +3275,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageProperties();
@@ -3310,7 +3283,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InsertTableColumnsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsertTableColumnsRequest();
@@ -3319,7 +3291,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InsertTableRowsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsertTableRowsRequest();
@@ -3328,7 +3299,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InsertTextRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildInsertTextRequest();
@@ -3337,7 +3307,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LayoutPlaceholderIdMapping", () {
     unittest.test("to-json--from-json", () {
       var o = buildLayoutPlaceholderIdMapping();
@@ -3346,7 +3315,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LayoutProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildLayoutProperties();
@@ -3355,7 +3323,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LayoutReference", () {
     unittest.test("to-json--from-json", () {
       var o = buildLayoutReference();
@@ -3364,7 +3331,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Line", () {
     unittest.test("to-json--from-json", () {
       var o = buildLine();
@@ -3373,7 +3339,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LineFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildLineFill();
@@ -3382,7 +3347,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LineProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildLineProperties();
@@ -3391,7 +3355,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Link", () {
     unittest.test("to-json--from-json", () {
       var o = buildLink();
@@ -3400,7 +3363,6 @@
     });
   });
 
-
   unittest.group("obj-schema-List", () {
     unittest.test("to-json--from-json", () {
       var o = buildList();
@@ -3409,7 +3371,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MasterProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildMasterProperties();
@@ -3418,7 +3379,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NestingLevel", () {
     unittest.test("to-json--from-json", () {
       var o = buildNestingLevel();
@@ -3427,7 +3387,6 @@
     });
   });
 
-
   unittest.group("obj-schema-NotesProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildNotesProperties();
@@ -3436,7 +3395,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OpaqueColor", () {
     unittest.test("to-json--from-json", () {
       var o = buildOpaqueColor();
@@ -3445,7 +3403,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OptionalColor", () {
     unittest.test("to-json--from-json", () {
       var o = buildOptionalColor();
@@ -3454,7 +3411,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Outline", () {
     unittest.test("to-json--from-json", () {
       var o = buildOutline();
@@ -3463,7 +3419,6 @@
     });
   });
 
-
   unittest.group("obj-schema-OutlineFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildOutlineFill();
@@ -3472,7 +3427,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Page", () {
     unittest.test("to-json--from-json", () {
       var o = buildPage();
@@ -3481,7 +3435,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageBackgroundFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageBackgroundFill();
@@ -3490,7 +3443,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageElement", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageElement();
@@ -3499,7 +3451,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageElementProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageElementProperties();
@@ -3508,7 +3459,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageProperties();
@@ -3517,7 +3467,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ParagraphMarker", () {
     unittest.test("to-json--from-json", () {
       var o = buildParagraphMarker();
@@ -3526,7 +3475,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ParagraphStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildParagraphStyle();
@@ -3535,7 +3483,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Placeholder", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaceholder();
@@ -3544,7 +3491,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Presentation", () {
     unittest.test("to-json--from-json", () {
       var o = buildPresentation();
@@ -3553,7 +3499,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Range", () {
     unittest.test("to-json--from-json", () {
       var o = buildRange();
@@ -3562,7 +3507,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Recolor", () {
     unittest.test("to-json--from-json", () {
       var o = buildRecolor();
@@ -3571,7 +3515,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RefreshSheetsChartRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRefreshSheetsChartRequest();
@@ -3580,7 +3523,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReplaceAllShapesWithImageRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplaceAllShapesWithImageRequest();
@@ -3589,7 +3531,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReplaceAllShapesWithImageResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplaceAllShapesWithImageResponse();
@@ -3598,25 +3539,24 @@
     });
   });
 
-
   unittest.group("obj-schema-ReplaceAllShapesWithSheetsChartRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplaceAllShapesWithSheetsChartRequest();
-      var od = new api.ReplaceAllShapesWithSheetsChartRequest.fromJson(o.toJson());
+      var od =
+          new api.ReplaceAllShapesWithSheetsChartRequest.fromJson(o.toJson());
       checkReplaceAllShapesWithSheetsChartRequest(od);
     });
   });
 
-
   unittest.group("obj-schema-ReplaceAllShapesWithSheetsChartResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplaceAllShapesWithSheetsChartResponse();
-      var od = new api.ReplaceAllShapesWithSheetsChartResponse.fromJson(o.toJson());
+      var od =
+          new api.ReplaceAllShapesWithSheetsChartResponse.fromJson(o.toJson());
       checkReplaceAllShapesWithSheetsChartResponse(od);
     });
   });
 
-
   unittest.group("obj-schema-ReplaceAllTextRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplaceAllTextRequest();
@@ -3625,7 +3565,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReplaceAllTextResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReplaceAllTextResponse();
@@ -3634,7 +3573,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Request", () {
     unittest.test("to-json--from-json", () {
       var o = buildRequest();
@@ -3643,7 +3581,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Response", () {
     unittest.test("to-json--from-json", () {
       var o = buildResponse();
@@ -3652,7 +3589,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RgbColor", () {
     unittest.test("to-json--from-json", () {
       var o = buildRgbColor();
@@ -3661,7 +3597,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Shadow", () {
     unittest.test("to-json--from-json", () {
       var o = buildShadow();
@@ -3670,7 +3605,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Shape", () {
     unittest.test("to-json--from-json", () {
       var o = buildShape();
@@ -3679,7 +3613,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ShapeBackgroundFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildShapeBackgroundFill();
@@ -3688,7 +3621,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ShapeProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildShapeProperties();
@@ -3697,7 +3629,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SheetsChart", () {
     unittest.test("to-json--from-json", () {
       var o = buildSheetsChart();
@@ -3706,7 +3637,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SheetsChartProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildSheetsChartProperties();
@@ -3715,7 +3645,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Size", () {
     unittest.test("to-json--from-json", () {
       var o = buildSize();
@@ -3724,7 +3653,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SlideProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildSlideProperties();
@@ -3733,7 +3661,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SolidFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildSolidFill();
@@ -3742,7 +3669,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StretchedPictureFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildStretchedPictureFill();
@@ -3751,7 +3677,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubstringMatchCriteria", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubstringMatchCriteria();
@@ -3760,7 +3685,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Table", () {
     unittest.test("to-json--from-json", () {
       var o = buildTable();
@@ -3769,7 +3693,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableCell", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableCell();
@@ -3778,7 +3701,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableCellBackgroundFill", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableCellBackgroundFill();
@@ -3787,7 +3709,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableCellLocation", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableCellLocation();
@@ -3796,7 +3717,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableCellProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableCellProperties();
@@ -3805,7 +3725,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableColumnProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableColumnProperties();
@@ -3814,7 +3733,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableRange();
@@ -3823,7 +3741,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TableRow", () {
     unittest.test("to-json--from-json", () {
       var o = buildTableRow();
@@ -3832,7 +3749,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextContent", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextContent();
@@ -3841,7 +3757,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextElement", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextElement();
@@ -3850,7 +3765,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextRun", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextRun();
@@ -3859,7 +3773,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextStyle();
@@ -3868,7 +3781,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThemeColorPair", () {
     unittest.test("to-json--from-json", () {
       var o = buildThemeColorPair();
@@ -3877,7 +3789,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Thumbnail", () {
     unittest.test("to-json--from-json", () {
       var o = buildThumbnail();
@@ -3886,7 +3797,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateImagePropertiesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateImagePropertiesRequest();
@@ -3895,7 +3805,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateLinePropertiesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateLinePropertiesRequest();
@@ -3904,7 +3813,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdatePageElementTransformRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdatePageElementTransformRequest();
@@ -3913,7 +3821,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdatePagePropertiesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdatePagePropertiesRequest();
@@ -3922,7 +3829,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateParagraphStyleRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateParagraphStyleRequest();
@@ -3931,7 +3837,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateShapePropertiesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateShapePropertiesRequest();
@@ -3940,7 +3845,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateSlidesPositionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateSlidesPositionRequest();
@@ -3949,7 +3853,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateTableCellPropertiesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateTableCellPropertiesRequest();
@@ -3958,7 +3861,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateTextStyleRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateTextStyleRequest();
@@ -3967,7 +3869,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateVideoPropertiesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateVideoPropertiesRequest();
@@ -3976,7 +3877,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Video", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideo();
@@ -3985,7 +3885,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoProperties();
@@ -3994,7 +3893,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WeightedFontFamily", () {
     unittest.test("to-json--from-json", () {
       var o = buildWeightedFontFamily();
@@ -4003,7 +3901,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WordArt", () {
     unittest.test("to-json--from-json", () {
       var o = buildWordArt();
@@ -4012,7 +3909,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WriteControl", () {
     unittest.test("to-json--from-json", () {
       var o = buildWriteControl();
@@ -4021,10 +3917,8 @@
     });
   });
 
-
   unittest.group("resource-PresentationsResourceApi", () {
     unittest.test("method--batchUpdate", () {
-
       var mock = new HttpServerMock();
       api.PresentationsResourceApi res = new api.SlidesApi(mock).presentations;
       var arg_request = buildBatchUpdatePresentationRequest();
@@ -4037,16 +3931,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/presentations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/presentations/"));
         pathOffset += 17;
         index = path.indexOf(":batchUpdate", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_presentationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals(":batchUpdate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals(":batchUpdate"));
         pathOffset += 12;
 
         var query = (req.url).query;
@@ -4059,27 +3957,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBatchUpdatePresentationResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.batchUpdate(arg_request, arg_presentationId).then(unittest.expectAsync1(((api.BatchUpdatePresentationResponse response) {
+      res.batchUpdate(arg_request, arg_presentationId).then(unittest
+          .expectAsync1(((api.BatchUpdatePresentationResponse response) {
         checkBatchUpdatePresentationResponse(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.PresentationsResourceApi res = new api.SlidesApi(mock).presentations;
       var arg_request = buildPresentation();
@@ -4091,9 +3990,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("v1/presentations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("v1/presentations"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -4106,27 +4007,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPresentation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Presentation response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Presentation response) {
         checkPresentation(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.PresentationsResourceApi res = new api.SlidesApi(mock).presentations;
       var arg_presentationId = "foo";
@@ -4135,9 +4038,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/presentations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/presentations/"));
         pathOffset += 17;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4151,33 +4056,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPresentation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_presentationId).then(unittest.expectAsync1(((api.Presentation response) {
+      res
+          .get(arg_presentationId)
+          .then(unittest.expectAsync1(((api.Presentation response) {
         checkPresentation(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PresentationsPagesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.PresentationsPagesResourceApi res = new api.SlidesApi(mock).presentations.pages;
+      api.PresentationsPagesResourceApi res =
+          new api.SlidesApi(mock).presentations.pages;
       var arg_presentationId = "foo";
       var arg_pageObjectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4185,16 +4091,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/presentations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/presentations/"));
         pathOffset += 17;
         index = path.indexOf("/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_presentationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/pages/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -4210,29 +4120,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_presentationId, arg_pageObjectId).then(unittest.expectAsync1(((api.Page response) {
+      res
+          .get(arg_presentationId, arg_pageObjectId)
+          .then(unittest.expectAsync1(((api.Page response) {
         checkPage(response);
       })));
     });
 
     unittest.test("method--getThumbnail", () {
-
       var mock = new HttpServerMock();
-      api.PresentationsPagesResourceApi res = new api.SlidesApi(mock).presentations.pages;
+      api.PresentationsPagesResourceApi res =
+          new api.SlidesApi(mock).presentations.pages;
       var arg_presentationId = "foo";
       var arg_pageObjectId = "foo";
       var arg_thumbnailProperties_thumbnailSize = "foo";
@@ -4242,23 +4155,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("v1/presentations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("v1/presentations/"));
         pathOffset += 17;
         index = path.indexOf("/pages/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_presentationId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pages/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/pages/"));
         pathOffset += 7;
         index = path.indexOf("/thumbnail", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_pageObjectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/thumbnail"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/thumbnail"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -4271,29 +4190,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["thumbnailProperties.thumbnailSize"].first, unittest.equals(arg_thumbnailProperties_thumbnailSize));
-        unittest.expect(queryMap["thumbnailProperties.mimeType"].first, unittest.equals(arg_thumbnailProperties_mimeType));
-
+        unittest.expect(queryMap["thumbnailProperties.thumbnailSize"].first,
+            unittest.equals(arg_thumbnailProperties_thumbnailSize));
+        unittest.expect(queryMap["thumbnailProperties.mimeType"].first,
+            unittest.equals(arg_thumbnailProperties_mimeType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildThumbnail());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getThumbnail(arg_presentationId, arg_pageObjectId, thumbnailProperties_thumbnailSize: arg_thumbnailProperties_thumbnailSize, thumbnailProperties_mimeType: arg_thumbnailProperties_mimeType).then(unittest.expectAsync1(((api.Thumbnail response) {
+      res
+          .getThumbnail(arg_presentationId, arg_pageObjectId,
+              thumbnailProperties_thumbnailSize:
+                  arg_thumbnailProperties_thumbnailSize,
+              thumbnailProperties_mimeType: arg_thumbnailProperties_mimeType)
+          .then(unittest.expectAsync1(((api.Thumbnail response) {
         checkThumbnail(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/sourcerepo/v1_test.dart b/generated/googleapis/test/sourcerepo/v1_test.dart
index 01c1478..9775b72 100644
--- a/generated/googleapis/test/sourcerepo/v1_test.dart
+++ b/generated/googleapis/test/sourcerepo/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.sourcerepo.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/sourcerepo/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,25 +44,61 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed496() {
+buildUnnamed495() {
   var o = new core.List<api.AuditLogConfig>();
   o.add(buildAuditLogConfig());
   o.add(buildAuditLogConfig());
   return o;
 }
 
-checkUnnamed496(core.List<api.AuditLogConfig> o) {
+checkUnnamed495(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditLogConfig(o[0]);
   checkAuditLogConfig(o[1]);
 }
 
+buildUnnamed496() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed496(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterAuditConfig = 0;
+buildAuditConfig() {
+  var o = new api.AuditConfig();
+  buildCounterAuditConfig++;
+  if (buildCounterAuditConfig < 3) {
+    o.auditLogConfigs = buildUnnamed495();
+    o.exemptedMembers = buildUnnamed496();
+    o.service = "foo";
+  }
+  buildCounterAuditConfig--;
+  return o;
+}
+
+checkAuditConfig(api.AuditConfig o) {
+  buildCounterAuditConfig++;
+  if (buildCounterAuditConfig < 3) {
+    checkUnnamed495(o.auditLogConfigs);
+    checkUnnamed496(o.exemptedMembers);
+    unittest.expect(o.service, unittest.equals('foo'));
+  }
+  buildCounterAuditConfig--;
+}
+
 buildUnnamed497() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -77,27 +112,25 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterAuditConfig = 0;
-buildAuditConfig() {
-  var o = new api.AuditConfig();
-  buildCounterAuditConfig++;
-  if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed496();
+core.int buildCounterAuditLogConfig = 0;
+buildAuditLogConfig() {
+  var o = new api.AuditLogConfig();
+  buildCounterAuditLogConfig++;
+  if (buildCounterAuditLogConfig < 3) {
     o.exemptedMembers = buildUnnamed497();
-    o.service = "foo";
+    o.logType = "foo";
   }
-  buildCounterAuditConfig--;
+  buildCounterAuditLogConfig--;
   return o;
 }
 
-checkAuditConfig(api.AuditConfig o) {
-  buildCounterAuditConfig++;
-  if (buildCounterAuditConfig < 3) {
-    checkUnnamed496(o.auditLogConfigs);
+checkAuditLogConfig(api.AuditLogConfig o) {
+  buildCounterAuditLogConfig++;
+  if (buildCounterAuditLogConfig < 3) {
     checkUnnamed497(o.exemptedMembers);
-    unittest.expect(o.service, unittest.equals('foo'));
+    unittest.expect(o.logType, unittest.equals('foo'));
   }
-  buildCounterAuditConfig--;
+  buildCounterAuditLogConfig--;
 }
 
 buildUnnamed498() {
@@ -113,46 +146,12 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterAuditLogConfig = 0;
-buildAuditLogConfig() {
-  var o = new api.AuditLogConfig();
-  buildCounterAuditLogConfig++;
-  if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed498();
-    o.logType = "foo";
-  }
-  buildCounterAuditLogConfig--;
-  return o;
-}
-
-checkAuditLogConfig(api.AuditLogConfig o) {
-  buildCounterAuditLogConfig++;
-  if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed498(o.exemptedMembers);
-    unittest.expect(o.logType, unittest.equals('foo'));
-  }
-  buildCounterAuditLogConfig--;
-}
-
-buildUnnamed499() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed499(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterBinding = 0;
 buildBinding() {
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.members = buildUnnamed499();
+    o.members = buildUnnamed498();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -162,7 +161,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkUnnamed499(o.members);
+    checkUnnamed498(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -187,14 +186,14 @@
   buildCounterCloudAuditOptions--;
 }
 
-buildUnnamed500() {
+buildUnnamed499() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed500(core.List<core.String> o) {
+checkUnnamed499(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -210,7 +209,7 @@
     o.svc = "foo";
     o.sys = "foo";
     o.value = "foo";
-    o.values = buildUnnamed500();
+    o.values = buildUnnamed499();
   }
   buildCounterCondition--;
   return o;
@@ -224,7 +223,7 @@
     unittest.expect(o.svc, unittest.equals('foo'));
     unittest.expect(o.sys, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed500(o.values);
+    checkUnnamed499(o.values);
   }
   buildCounterCondition--;
 }
@@ -254,16 +253,14 @@
 buildDataAccessOptions() {
   var o = new api.DataAccessOptions();
   buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-  }
+  if (buildCounterDataAccessOptions < 3) {}
   buildCounterDataAccessOptions--;
   return o;
 }
 
 checkDataAccessOptions(api.DataAccessOptions o) {
   buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-  }
+  if (buildCounterDataAccessOptions < 3) {}
   buildCounterDataAccessOptions--;
 }
 
@@ -271,27 +268,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed501() {
+buildUnnamed500() {
   var o = new core.List<api.Repo>();
   o.add(buildRepo());
   o.add(buildRepo());
   return o;
 }
 
-checkUnnamed501(core.List<api.Repo> o) {
+checkUnnamed500(core.List<api.Repo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRepo(o[0]);
   checkRepo(o[1]);
@@ -303,7 +298,7 @@
   buildCounterListReposResponse++;
   if (buildCounterListReposResponse < 3) {
     o.nextPageToken = "foo";
-    o.repos = buildUnnamed501();
+    o.repos = buildUnnamed500();
   }
   buildCounterListReposResponse--;
   return o;
@@ -313,7 +308,7 @@
   buildCounterListReposResponse++;
   if (buildCounterListReposResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed501(o.repos);
+    checkUnnamed500(o.repos);
   }
   buildCounterListReposResponse--;
 }
@@ -364,40 +359,40 @@
   buildCounterMirrorConfig--;
 }
 
-buildUnnamed502() {
+buildUnnamed501() {
   var o = new core.List<api.AuditConfig>();
   o.add(buildAuditConfig());
   o.add(buildAuditConfig());
   return o;
 }
 
-checkUnnamed502(core.List<api.AuditConfig> o) {
+checkUnnamed501(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuditConfig(o[0]);
   checkAuditConfig(o[1]);
 }
 
-buildUnnamed503() {
+buildUnnamed502() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed503(core.List<api.Binding> o) {
+checkUnnamed502(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
 }
 
-buildUnnamed504() {
+buildUnnamed503() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed504(core.List<api.Rule> o) {
+checkUnnamed503(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
@@ -408,11 +403,11 @@
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed502();
-    o.bindings = buildUnnamed503();
+    o.auditConfigs = buildUnnamed501();
+    o.bindings = buildUnnamed502();
     o.etag = "foo";
     o.iamOwned = true;
-    o.rules = buildUnnamed504();
+    o.rules = buildUnnamed503();
     o.version = 42;
   }
   buildCounterPolicy--;
@@ -422,11 +417,11 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed502(o.auditConfigs);
-    checkUnnamed503(o.bindings);
+    checkUnnamed501(o.auditConfigs);
+    checkUnnamed502(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed504(o.rules);
+    checkUnnamed503(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
@@ -457,45 +452,58 @@
   buildCounterRepo--;
 }
 
-buildUnnamed505() {
+buildUnnamed504() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed505(core.List<api.Condition> o) {
+checkUnnamed504(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed506() {
+buildUnnamed505() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed506(core.List<core.String> o) {
+checkUnnamed505(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed507() {
+buildUnnamed506() {
   var o = new core.List<api.LogConfig>();
   o.add(buildLogConfig());
   o.add(buildLogConfig());
   return o;
 }
 
-checkUnnamed507(core.List<api.LogConfig> o) {
+checkUnnamed506(core.List<api.LogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLogConfig(o[0]);
   checkLogConfig(o[1]);
 }
 
+buildUnnamed507() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed507(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed508() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -509,31 +517,18 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed509() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed509(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterRule = 0;
 buildRule() {
   var o = new api.Rule();
   buildCounterRule++;
   if (buildCounterRule < 3) {
     o.action = "foo";
-    o.conditions = buildUnnamed505();
+    o.conditions = buildUnnamed504();
     o.description = "foo";
-    o.in_ = buildUnnamed506();
-    o.logConfig = buildUnnamed507();
-    o.notIn = buildUnnamed508();
-    o.permissions = buildUnnamed509();
+    o.in_ = buildUnnamed505();
+    o.logConfig = buildUnnamed506();
+    o.notIn = buildUnnamed507();
+    o.permissions = buildUnnamed508();
   }
   buildCounterRule--;
   return o;
@@ -543,12 +538,12 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed505(o.conditions);
+    checkUnnamed504(o.conditions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed506(o.in_);
-    checkUnnamed507(o.logConfig);
-    checkUnnamed508(o.notIn);
-    checkUnnamed509(o.permissions);
+    checkUnnamed505(o.in_);
+    checkUnnamed506(o.logConfig);
+    checkUnnamed507(o.notIn);
+    checkUnnamed508(o.permissions);
   }
   buildCounterRule--;
 }
@@ -574,6 +569,38 @@
   buildCounterSetIamPolicyRequest--;
 }
 
+buildUnnamed509() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed509(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterTestIamPermissionsRequest = 0;
+buildTestIamPermissionsRequest() {
+  var o = new api.TestIamPermissionsRequest();
+  buildCounterTestIamPermissionsRequest++;
+  if (buildCounterTestIamPermissionsRequest < 3) {
+    o.permissions = buildUnnamed509();
+  }
+  buildCounterTestIamPermissionsRequest--;
+  return o;
+}
+
+checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
+  buildCounterTestIamPermissionsRequest++;
+  if (buildCounterTestIamPermissionsRequest < 3) {
+    checkUnnamed509(o.permissions);
+  }
+  buildCounterTestIamPermissionsRequest--;
+}
+
 buildUnnamed510() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -587,44 +614,12 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterTestIamPermissionsRequest = 0;
-buildTestIamPermissionsRequest() {
-  var o = new api.TestIamPermissionsRequest();
-  buildCounterTestIamPermissionsRequest++;
-  if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed510();
-  }
-  buildCounterTestIamPermissionsRequest--;
-  return o;
-}
-
-checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
-  buildCounterTestIamPermissionsRequest++;
-  if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed510(o.permissions);
-  }
-  buildCounterTestIamPermissionsRequest--;
-}
-
-buildUnnamed511() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed511(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterTestIamPermissionsResponse = 0;
 buildTestIamPermissionsResponse() {
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed511();
+    o.permissions = buildUnnamed510();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -633,12 +628,11 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed511(o.permissions);
+    checkUnnamed510(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
 
-
 main() {
   unittest.group("obj-schema-AuditConfig", () {
     unittest.test("to-json--from-json", () {
@@ -648,7 +642,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AuditLogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildAuditLogConfig();
@@ -657,7 +650,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -666,7 +658,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CloudAuditOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildCloudAuditOptions();
@@ -675,7 +666,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Condition", () {
     unittest.test("to-json--from-json", () {
       var o = buildCondition();
@@ -684,7 +674,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CounterOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildCounterOptions();
@@ -693,7 +682,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DataAccessOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildDataAccessOptions();
@@ -702,7 +690,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -711,7 +698,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListReposResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListReposResponse();
@@ -720,7 +706,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LogConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildLogConfig();
@@ -729,7 +714,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MirrorConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildMirrorConfig();
@@ -738,7 +722,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -747,7 +730,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Repo", () {
     unittest.test("to-json--from-json", () {
       var o = buildRepo();
@@ -756,7 +738,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Rule", () {
     unittest.test("to-json--from-json", () {
       var o = buildRule();
@@ -765,7 +746,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -774,7 +754,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -783,7 +762,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -792,12 +770,11 @@
     });
   });
 
-
   unittest.group("resource-ProjectsReposResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_request = buildRepo();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -808,9 +785,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -824,38 +803,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRepo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.Repo response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.Repo response) {
         checkRepo(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -869,16 +853,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -889,18 +874,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -914,16 +901,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRepo());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -934,18 +922,20 @@
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -959,29 +949,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_name = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -990,9 +983,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1006,31 +1001,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListReposResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListReposResponse response) {
+      res
+          .list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListReposResponse response) {
         checkListReposResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1041,9 +1041,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1057,29 +1059,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsReposResourceApi res = new api.SourcerepoApi(mock).projects.repos;
+      api.ProjectsReposResourceApi res =
+          new api.SourcerepoApi(mock).projects.repos;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1090,9 +1095,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1106,27 +1113,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/spanner/v1_test.dart b/generated/googleapis/test/spanner/v1_test.dart
index 7151dc0..db0dba0 100644
--- a/generated/googleapis/test/spanner/v1_test.dart
+++ b/generated/googleapis/test/spanner/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.spanner.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/spanner/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,114 +44,12 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2105() {
-  var o = new core.List<api.AuditLogConfig>();
-  o.add(buildAuditLogConfig());
-  o.add(buildAuditLogConfig());
-  return o;
-}
-
-checkUnnamed2105(core.List<api.AuditLogConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
-}
-
-buildUnnamed2106() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2106(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterAuditConfig = 0;
-buildAuditConfig() {
-  var o = new api.AuditConfig();
-  buildCounterAuditConfig++;
-  if (buildCounterAuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed2105();
-    o.exemptedMembers = buildUnnamed2106();
-    o.service = "foo";
-  }
-  buildCounterAuditConfig--;
-  return o;
-}
-
-checkAuditConfig(api.AuditConfig o) {
-  buildCounterAuditConfig++;
-  if (buildCounterAuditConfig < 3) {
-    checkUnnamed2105(o.auditLogConfigs);
-    checkUnnamed2106(o.exemptedMembers);
-    unittest.expect(o.service, unittest.equals('foo'));
-  }
-  buildCounterAuditConfig--;
-}
-
-buildUnnamed2107() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2107(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterAuditLogConfig = 0;
-buildAuditLogConfig() {
-  var o = new api.AuditLogConfig();
-  buildCounterAuditLogConfig++;
-  if (buildCounterAuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed2107();
-    o.logType = "foo";
-  }
-  buildCounterAuditLogConfig--;
-  return o;
-}
-
-checkAuditLogConfig(api.AuditLogConfig o) {
-  buildCounterAuditLogConfig++;
-  if (buildCounterAuditLogConfig < 3) {
-    checkUnnamed2107(o.exemptedMembers);
-    unittest.expect(o.logType, unittest.equals('foo'));
-  }
-  buildCounterAuditLogConfig--;
-}
-
-core.int buildCounterAuthorizationLoggingOptions = 0;
-buildAuthorizationLoggingOptions() {
-  var o = new api.AuthorizationLoggingOptions();
-  buildCounterAuthorizationLoggingOptions++;
-  if (buildCounterAuthorizationLoggingOptions < 3) {
-    o.permissionType = "foo";
-  }
-  buildCounterAuthorizationLoggingOptions--;
-  return o;
-}
-
-checkAuthorizationLoggingOptions(api.AuthorizationLoggingOptions o) {
-  buildCounterAuthorizationLoggingOptions++;
-  if (buildCounterAuthorizationLoggingOptions < 3) {
-    unittest.expect(o.permissionType, unittest.equals('foo'));
-  }
-  buildCounterAuthorizationLoggingOptions--;
-}
-
 core.int buildCounterBeginTransactionRequest = 0;
 buildBeginTransactionRequest() {
   var o = new api.BeginTransactionRequest();
@@ -172,14 +69,14 @@
   buildCounterBeginTransactionRequest--;
 }
 
-buildUnnamed2108() {
+buildUnnamed2103() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2108(core.List<core.String> o) {
+checkUnnamed2103(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -190,8 +87,7 @@
   var o = new api.Binding();
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    o.condition = buildExpr();
-    o.members = buildUnnamed2108();
+    o.members = buildUnnamed2103();
     o.role = "foo";
   }
   buildCounterBinding--;
@@ -201,8 +97,7 @@
 checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
-    checkUnnamed2108(o.members);
+    checkUnnamed2103(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterBinding--;
@@ -231,35 +126,14 @@
   buildCounterChildLink--;
 }
 
-core.int buildCounterCloudAuditOptions = 0;
-buildCloudAuditOptions() {
-  var o = new api.CloudAuditOptions();
-  buildCounterCloudAuditOptions++;
-  if (buildCounterCloudAuditOptions < 3) {
-    o.authorizationLoggingOptions = buildAuthorizationLoggingOptions();
-    o.logName = "foo";
-  }
-  buildCounterCloudAuditOptions--;
-  return o;
-}
-
-checkCloudAuditOptions(api.CloudAuditOptions o) {
-  buildCounterCloudAuditOptions++;
-  if (buildCounterCloudAuditOptions < 3) {
-    checkAuthorizationLoggingOptions(o.authorizationLoggingOptions);
-    unittest.expect(o.logName, unittest.equals('foo'));
-  }
-  buildCounterCloudAuditOptions--;
-}
-
-buildUnnamed2109() {
+buildUnnamed2104() {
   var o = new core.List<api.Mutation>();
   o.add(buildMutation());
   o.add(buildMutation());
   return o;
 }
 
-checkUnnamed2109(core.List<api.Mutation> o) {
+checkUnnamed2104(core.List<api.Mutation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMutation(o[0]);
   checkMutation(o[1]);
@@ -270,7 +144,7 @@
   var o = new api.CommitRequest();
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
-    o.mutations = buildUnnamed2109();
+    o.mutations = buildUnnamed2104();
     o.singleUseTransaction = buildTransactionOptions();
     o.transactionId = "foo";
   }
@@ -281,7 +155,7 @@
 checkCommitRequest(api.CommitRequest o) {
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
-    checkUnnamed2109(o.mutations);
+    checkUnnamed2104(o.mutations);
     checkTransactionOptions(o.singleUseTransaction);
     unittest.expect(o.transactionId, unittest.equals('foo'));
   }
@@ -307,69 +181,6 @@
   buildCounterCommitResponse--;
 }
 
-buildUnnamed2110() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2110(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterCondition = 0;
-buildCondition() {
-  var o = new api.Condition();
-  buildCounterCondition++;
-  if (buildCounterCondition < 3) {
-    o.iam = "foo";
-    o.op = "foo";
-    o.svc = "foo";
-    o.sys = "foo";
-    o.value = "foo";
-    o.values = buildUnnamed2110();
-  }
-  buildCounterCondition--;
-  return o;
-}
-
-checkCondition(api.Condition o) {
-  buildCounterCondition++;
-  if (buildCounterCondition < 3) {
-    unittest.expect(o.iam, unittest.equals('foo'));
-    unittest.expect(o.op, unittest.equals('foo'));
-    unittest.expect(o.svc, unittest.equals('foo'));
-    unittest.expect(o.sys, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-    checkUnnamed2110(o.values);
-  }
-  buildCounterCondition--;
-}
-
-core.int buildCounterCounterOptions = 0;
-buildCounterOptions() {
-  var o = new api.CounterOptions();
-  buildCounterCounterOptions++;
-  if (buildCounterCounterOptions < 3) {
-    o.field = "foo";
-    o.metric = "foo";
-  }
-  buildCounterCounterOptions--;
-  return o;
-}
-
-checkCounterOptions(api.CounterOptions o) {
-  buildCounterCounterOptions++;
-  if (buildCounterCounterOptions < 3) {
-    unittest.expect(o.field, unittest.equals('foo'));
-    unittest.expect(o.metric, unittest.equals('foo'));
-  }
-  buildCounterCounterOptions--;
-}
-
 core.int buildCounterCreateDatabaseMetadata = 0;
 buildCreateDatabaseMetadata() {
   var o = new api.CreateDatabaseMetadata();
@@ -389,14 +200,14 @@
   buildCounterCreateDatabaseMetadata--;
 }
 
-buildUnnamed2111() {
+buildUnnamed2105() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2111(core.List<core.String> o) {
+checkUnnamed2105(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -408,7 +219,7 @@
   buildCounterCreateDatabaseRequest++;
   if (buildCounterCreateDatabaseRequest < 3) {
     o.createStatement = "foo";
-    o.extraStatements = buildUnnamed2111();
+    o.extraStatements = buildUnnamed2105();
   }
   buildCounterCreateDatabaseRequest--;
   return o;
@@ -418,7 +229,7 @@
   buildCounterCreateDatabaseRequest++;
   if (buildCounterCreateDatabaseRequest < 3) {
     unittest.expect(o.createStatement, unittest.equals('foo'));
-    checkUnnamed2111(o.extraStatements);
+    checkUnnamed2105(o.extraStatements);
   }
   buildCounterCreateDatabaseRequest--;
 }
@@ -469,23 +280,6 @@
   buildCounterCreateInstanceRequest--;
 }
 
-core.int buildCounterDataAccessOptions = 0;
-buildDataAccessOptions() {
-  var o = new api.DataAccessOptions();
-  buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-  }
-  buildCounterDataAccessOptions--;
-  return o;
-}
-
-checkDataAccessOptions(api.DataAccessOptions o) {
-  buildCounterDataAccessOptions++;
-  if (buildCounterDataAccessOptions < 3) {
-  }
-  buildCounterDataAccessOptions--;
-}
-
 core.int buildCounterDatabase = 0;
 buildDatabase() {
   var o = new api.Database();
@@ -532,43 +326,57 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed2112() {
+buildUnnamed2106() {
   var o = new core.Map<core.String, api.Type>();
   o["x"] = buildType();
   o["y"] = buildType();
   return o;
 }
 
-checkUnnamed2112(core.Map<core.String, api.Type> o) {
+checkUnnamed2106(core.Map<core.String, api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkType(o["x"]);
   checkType(o["y"]);
 }
 
-buildUnnamed2113() {
+buildUnnamed2107() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2113(core.Map<core.String, core.Object> o) {
+checkUnnamed2107(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterExecuteSqlRequest = 0;
@@ -576,8 +384,8 @@
   var o = new api.ExecuteSqlRequest();
   buildCounterExecuteSqlRequest++;
   if (buildCounterExecuteSqlRequest < 3) {
-    o.paramTypes = buildUnnamed2112();
-    o.params = buildUnnamed2113();
+    o.paramTypes = buildUnnamed2106();
+    o.params = buildUnnamed2107();
     o.queryMode = "foo";
     o.resumeToken = "foo";
     o.sql = "foo";
@@ -590,8 +398,8 @@
 checkExecuteSqlRequest(api.ExecuteSqlRequest o) {
   buildCounterExecuteSqlRequest++;
   if (buildCounterExecuteSqlRequest < 3) {
-    checkUnnamed2112(o.paramTypes);
-    checkUnnamed2113(o.params);
+    checkUnnamed2106(o.paramTypes);
+    checkUnnamed2107(o.params);
     unittest.expect(o.queryMode, unittest.equals('foo'));
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     unittest.expect(o.sql, unittest.equals('foo'));
@@ -600,31 +408,6 @@
   buildCounterExecuteSqlRequest--;
 }
 
-core.int buildCounterExpr = 0;
-buildExpr() {
-  var o = new api.Expr();
-  buildCounterExpr++;
-  if (buildCounterExpr < 3) {
-    o.description = "foo";
-    o.expression = "foo";
-    o.location = "foo";
-    o.title = "foo";
-  }
-  buildCounterExpr--;
-  return o;
-}
-
-checkExpr(api.Expr o) {
-  buildCounterExpr++;
-  if (buildCounterExpr < 3) {
-    unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.expression, unittest.equals('foo'));
-    unittest.expect(o.location, unittest.equals('foo'));
-    unittest.expect(o.title, unittest.equals('foo'));
-  }
-  buildCounterExpr--;
-}
-
 core.int buildCounterField = 0;
 buildField() {
   var o = new api.Field();
@@ -646,14 +429,14 @@
   buildCounterField--;
 }
 
-buildUnnamed2114() {
+buildUnnamed2108() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2114(core.List<core.String> o) {
+checkUnnamed2108(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -664,7 +447,7 @@
   var o = new api.GetDatabaseDdlResponse();
   buildCounterGetDatabaseDdlResponse++;
   if (buildCounterGetDatabaseDdlResponse < 3) {
-    o.statements = buildUnnamed2114();
+    o.statements = buildUnnamed2108();
   }
   buildCounterGetDatabaseDdlResponse--;
   return o;
@@ -673,7 +456,7 @@
 checkGetDatabaseDdlResponse(api.GetDatabaseDdlResponse o) {
   buildCounterGetDatabaseDdlResponse++;
   if (buildCounterGetDatabaseDdlResponse < 3) {
-    checkUnnamed2114(o.statements);
+    checkUnnamed2108(o.statements);
   }
   buildCounterGetDatabaseDdlResponse--;
 }
@@ -682,27 +465,25 @@
 buildGetIamPolicyRequest() {
   var o = new api.GetIamPolicyRequest();
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
   return o;
 }
 
 checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
-  if (buildCounterGetIamPolicyRequest < 3) {
-  }
+  if (buildCounterGetIamPolicyRequest < 3) {}
   buildCounterGetIamPolicyRequest--;
 }
 
-buildUnnamed2115() {
+buildUnnamed2109() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed2115(core.Map<core.String, core.String> o) {
+checkUnnamed2109(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -715,7 +496,7 @@
   if (buildCounterInstance < 3) {
     o.config = "foo";
     o.displayName = "foo";
-    o.labels = buildUnnamed2115();
+    o.labels = buildUnnamed2109();
     o.name = "foo";
     o.nodeCount = 42;
     o.state = "foo";
@@ -729,7 +510,7 @@
   if (buildCounterInstance < 3) {
     unittest.expect(o.config, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed2115(o.labels);
+    checkUnnamed2109(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nodeCount, unittest.equals(42));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -758,56 +539,120 @@
   buildCounterInstanceConfig--;
 }
 
-buildUnnamed2116() {
+buildUnnamed2110() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2116(core.List<core.Object> o) {
+checkUnnamed2110(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o[0]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o[1]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2117() {
+buildUnnamed2111() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2117(core.List<core.Object> o) {
+checkUnnamed2111(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o[0]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o[1]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2118() {
+buildUnnamed2112() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2118(core.List<core.Object> o) {
+checkUnnamed2112(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted7 = (o[0]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
-  var casted8 = (o[1]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted7 = (o[0]) as core.Map;
+  unittest.expect(casted7, unittest.hasLength(3));
+  unittest.expect(casted7["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted7["bool"], unittest.equals(true));
+  unittest.expect(casted7["string"], unittest.equals('foo'));
+  var casted8 = (o[1]) as core.Map;
+  unittest.expect(casted8, unittest.hasLength(3));
+  unittest.expect(casted8["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted8["bool"], unittest.equals(true));
+  unittest.expect(casted8["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2119() {
+buildUnnamed2113() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2119(core.List<core.Object> o) {
+checkUnnamed2113(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted9 = (o[0]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
-  var casted10 = (o[1]) as core.Map; unittest.expect(casted10, unittest.hasLength(3)); unittest.expect(casted10["list"], unittest.equals([1, 2, 3])); unittest.expect(casted10["bool"], unittest.equals(true)); unittest.expect(casted10["string"], unittest.equals('foo')); 
+  var casted9 = (o[0]) as core.Map;
+  unittest.expect(casted9, unittest.hasLength(3));
+  unittest.expect(casted9["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted9["bool"], unittest.equals(true));
+  unittest.expect(casted9["string"], unittest.equals('foo'));
+  var casted10 = (o[1]) as core.Map;
+  unittest.expect(casted10, unittest.hasLength(3));
+  unittest.expect(casted10["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted10["bool"], unittest.equals(true));
+  unittest.expect(casted10["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterKeyRange = 0;
@@ -815,10 +660,10 @@
   var o = new api.KeyRange();
   buildCounterKeyRange++;
   if (buildCounterKeyRange < 3) {
-    o.endClosed = buildUnnamed2116();
-    o.endOpen = buildUnnamed2117();
-    o.startClosed = buildUnnamed2118();
-    o.startOpen = buildUnnamed2119();
+    o.endClosed = buildUnnamed2110();
+    o.endOpen = buildUnnamed2111();
+    o.startClosed = buildUnnamed2112();
+    o.startOpen = buildUnnamed2113();
   }
   buildCounterKeyRange--;
   return o;
@@ -827,48 +672,64 @@
 checkKeyRange(api.KeyRange o) {
   buildCounterKeyRange++;
   if (buildCounterKeyRange < 3) {
-    checkUnnamed2116(o.endClosed);
-    checkUnnamed2117(o.endOpen);
-    checkUnnamed2118(o.startClosed);
-    checkUnnamed2119(o.startOpen);
+    checkUnnamed2110(o.endClosed);
+    checkUnnamed2111(o.endOpen);
+    checkUnnamed2112(o.startClosed);
+    checkUnnamed2113(o.startOpen);
   }
   buildCounterKeyRange--;
 }
 
-buildUnnamed2120() {
+buildUnnamed2114() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2120(core.List<core.Object> o) {
+checkUnnamed2114(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted11 = (o[0]) as core.Map; unittest.expect(casted11, unittest.hasLength(3)); unittest.expect(casted11["list"], unittest.equals([1, 2, 3])); unittest.expect(casted11["bool"], unittest.equals(true)); unittest.expect(casted11["string"], unittest.equals('foo')); 
-  var casted12 = (o[1]) as core.Map; unittest.expect(casted12, unittest.hasLength(3)); unittest.expect(casted12["list"], unittest.equals([1, 2, 3])); unittest.expect(casted12["bool"], unittest.equals(true)); unittest.expect(casted12["string"], unittest.equals('foo')); 
+  var casted11 = (o[0]) as core.Map;
+  unittest.expect(casted11, unittest.hasLength(3));
+  unittest.expect(casted11["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted11["bool"], unittest.equals(true));
+  unittest.expect(casted11["string"], unittest.equals('foo'));
+  var casted12 = (o[1]) as core.Map;
+  unittest.expect(casted12, unittest.hasLength(3));
+  unittest.expect(casted12["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted12["bool"], unittest.equals(true));
+  unittest.expect(casted12["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2121() {
+buildUnnamed2115() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2120());
-  o.add(buildUnnamed2120());
+  o.add(buildUnnamed2114());
+  o.add(buildUnnamed2114());
   return o;
 }
 
-checkUnnamed2121(core.List<core.List<core.Object>> o) {
+checkUnnamed2115(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2120(o[0]);
-  checkUnnamed2120(o[1]);
+  checkUnnamed2114(o[0]);
+  checkUnnamed2114(o[1]);
 }
 
-buildUnnamed2122() {
+buildUnnamed2116() {
   var o = new core.List<api.KeyRange>();
   o.add(buildKeyRange());
   o.add(buildKeyRange());
   return o;
 }
 
-checkUnnamed2122(core.List<api.KeyRange> o) {
+checkUnnamed2116(core.List<api.KeyRange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyRange(o[0]);
   checkKeyRange(o[1]);
@@ -880,8 +741,8 @@
   buildCounterKeySet++;
   if (buildCounterKeySet < 3) {
     o.all = true;
-    o.keys = buildUnnamed2121();
-    o.ranges = buildUnnamed2122();
+    o.keys = buildUnnamed2115();
+    o.ranges = buildUnnamed2116();
   }
   buildCounterKeySet--;
   return o;
@@ -891,20 +752,20 @@
   buildCounterKeySet++;
   if (buildCounterKeySet < 3) {
     unittest.expect(o.all, unittest.isTrue);
-    checkUnnamed2121(o.keys);
-    checkUnnamed2122(o.ranges);
+    checkUnnamed2115(o.keys);
+    checkUnnamed2116(o.ranges);
   }
   buildCounterKeySet--;
 }
 
-buildUnnamed2123() {
+buildUnnamed2117() {
   var o = new core.List<api.Database>();
   o.add(buildDatabase());
   o.add(buildDatabase());
   return o;
 }
 
-checkUnnamed2123(core.List<api.Database> o) {
+checkUnnamed2117(core.List<api.Database> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabase(o[0]);
   checkDatabase(o[1]);
@@ -915,7 +776,7 @@
   var o = new api.ListDatabasesResponse();
   buildCounterListDatabasesResponse++;
   if (buildCounterListDatabasesResponse < 3) {
-    o.databases = buildUnnamed2123();
+    o.databases = buildUnnamed2117();
     o.nextPageToken = "foo";
   }
   buildCounterListDatabasesResponse--;
@@ -925,20 +786,20 @@
 checkListDatabasesResponse(api.ListDatabasesResponse o) {
   buildCounterListDatabasesResponse++;
   if (buildCounterListDatabasesResponse < 3) {
-    checkUnnamed2123(o.databases);
+    checkUnnamed2117(o.databases);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatabasesResponse--;
 }
 
-buildUnnamed2124() {
+buildUnnamed2118() {
   var o = new core.List<api.InstanceConfig>();
   o.add(buildInstanceConfig());
   o.add(buildInstanceConfig());
   return o;
 }
 
-checkUnnamed2124(core.List<api.InstanceConfig> o) {
+checkUnnamed2118(core.List<api.InstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceConfig(o[0]);
   checkInstanceConfig(o[1]);
@@ -949,7 +810,7 @@
   var o = new api.ListInstanceConfigsResponse();
   buildCounterListInstanceConfigsResponse++;
   if (buildCounterListInstanceConfigsResponse < 3) {
-    o.instanceConfigs = buildUnnamed2124();
+    o.instanceConfigs = buildUnnamed2118();
     o.nextPageToken = "foo";
   }
   buildCounterListInstanceConfigsResponse--;
@@ -959,20 +820,20 @@
 checkListInstanceConfigsResponse(api.ListInstanceConfigsResponse o) {
   buildCounterListInstanceConfigsResponse++;
   if (buildCounterListInstanceConfigsResponse < 3) {
-    checkUnnamed2124(o.instanceConfigs);
+    checkUnnamed2118(o.instanceConfigs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInstanceConfigsResponse--;
 }
 
-buildUnnamed2125() {
+buildUnnamed2119() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed2125(core.List<api.Instance> o) {
+checkUnnamed2119(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -983,7 +844,7 @@
   var o = new api.ListInstancesResponse();
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    o.instances = buildUnnamed2125();
+    o.instances = buildUnnamed2119();
     o.nextPageToken = "foo";
   }
   buildCounterListInstancesResponse--;
@@ -993,20 +854,20 @@
 checkListInstancesResponse(api.ListInstancesResponse o) {
   buildCounterListInstancesResponse++;
   if (buildCounterListInstancesResponse < 3) {
-    checkUnnamed2125(o.instances);
+    checkUnnamed2119(o.instances);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListInstancesResponse--;
 }
 
-buildUnnamed2126() {
+buildUnnamed2120() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2126(core.List<api.Operation> o) {
+checkUnnamed2120(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -1018,7 +879,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2126();
+    o.operations = buildUnnamed2120();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -1028,34 +889,11 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2126(o.operations);
+    checkUnnamed2120(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-core.int buildCounterLogConfig = 0;
-buildLogConfig() {
-  var o = new api.LogConfig();
-  buildCounterLogConfig++;
-  if (buildCounterLogConfig < 3) {
-    o.cloudAudit = buildCloudAuditOptions();
-    o.counter = buildCounterOptions();
-    o.dataAccess = buildDataAccessOptions();
-  }
-  buildCounterLogConfig--;
-  return o;
-}
-
-checkLogConfig(api.LogConfig o) {
-  buildCounterLogConfig++;
-  if (buildCounterLogConfig < 3) {
-    checkCloudAuditOptions(o.cloudAudit);
-    checkCounterOptions(o.counter);
-    checkDataAccessOptions(o.dataAccess);
-  }
-  buildCounterLogConfig--;
-}
-
 core.int buildCounterMutation = 0;
 buildMutation() {
   var o = new api.Mutation();
@@ -1083,30 +921,62 @@
   buildCounterMutation--;
 }
 
-buildUnnamed2127() {
+buildUnnamed2121() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2127(core.Map<core.String, core.Object> o) {
+checkUnnamed2121(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted13 = (o["x"]) as core.Map; unittest.expect(casted13, unittest.hasLength(3)); unittest.expect(casted13["list"], unittest.equals([1, 2, 3])); unittest.expect(casted13["bool"], unittest.equals(true)); unittest.expect(casted13["string"], unittest.equals('foo')); 
-  var casted14 = (o["y"]) as core.Map; unittest.expect(casted14, unittest.hasLength(3)); unittest.expect(casted14["list"], unittest.equals([1, 2, 3])); unittest.expect(casted14["bool"], unittest.equals(true)); unittest.expect(casted14["string"], unittest.equals('foo')); 
+  var casted13 = (o["x"]) as core.Map;
+  unittest.expect(casted13, unittest.hasLength(3));
+  unittest.expect(casted13["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted13["bool"], unittest.equals(true));
+  unittest.expect(casted13["string"], unittest.equals('foo'));
+  var casted14 = (o["y"]) as core.Map;
+  unittest.expect(casted14, unittest.hasLength(3));
+  unittest.expect(casted14["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted14["bool"], unittest.equals(true));
+  unittest.expect(casted14["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2128() {
+buildUnnamed2122() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2128(core.Map<core.String, core.Object> o) {
+checkUnnamed2122(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted15 = (o["x"]) as core.Map; unittest.expect(casted15, unittest.hasLength(3)); unittest.expect(casted15["list"], unittest.equals([1, 2, 3])); unittest.expect(casted15["bool"], unittest.equals(true)); unittest.expect(casted15["string"], unittest.equals('foo')); 
-  var casted16 = (o["y"]) as core.Map; unittest.expect(casted16, unittest.hasLength(3)); unittest.expect(casted16["list"], unittest.equals([1, 2, 3])); unittest.expect(casted16["bool"], unittest.equals(true)); unittest.expect(casted16["string"], unittest.equals('foo')); 
+  var casted15 = (o["x"]) as core.Map;
+  unittest.expect(casted15, unittest.hasLength(3));
+  unittest.expect(casted15["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted15["bool"], unittest.equals(true));
+  unittest.expect(casted15["string"], unittest.equals('foo'));
+  var casted16 = (o["y"]) as core.Map;
+  unittest.expect(casted16, unittest.hasLength(3));
+  unittest.expect(casted16["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted16["bool"], unittest.equals(true));
+  unittest.expect(casted16["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -1116,9 +986,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2127();
+    o.metadata = buildUnnamed2121();
     o.name = "foo";
-    o.response = buildUnnamed2128();
+    o.response = buildUnnamed2122();
   }
   buildCounterOperation--;
   return o;
@@ -1129,24 +999,40 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2127(o.metadata);
+    checkUnnamed2121(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2128(o.response);
+    checkUnnamed2122(o.response);
   }
   buildCounterOperation--;
 }
 
-buildUnnamed2129() {
+buildUnnamed2123() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2129(core.List<core.Object> o) {
+checkUnnamed2123(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted17 = (o[0]) as core.Map; unittest.expect(casted17, unittest.hasLength(3)); unittest.expect(casted17["list"], unittest.equals([1, 2, 3])); unittest.expect(casted17["bool"], unittest.equals(true)); unittest.expect(casted17["string"], unittest.equals('foo')); 
-  var casted18 = (o[1]) as core.Map; unittest.expect(casted18, unittest.hasLength(3)); unittest.expect(casted18["list"], unittest.equals([1, 2, 3])); unittest.expect(casted18["bool"], unittest.equals(true)); unittest.expect(casted18["string"], unittest.equals('foo')); 
+  var casted17 = (o[0]) as core.Map;
+  unittest.expect(casted17, unittest.hasLength(3));
+  unittest.expect(casted17["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted17["bool"], unittest.equals(true));
+  unittest.expect(casted17["string"], unittest.equals('foo'));
+  var casted18 = (o[1]) as core.Map;
+  unittest.expect(casted18, unittest.hasLength(3));
+  unittest.expect(casted18["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted18["bool"], unittest.equals(true));
+  unittest.expect(casted18["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterPartialResultSet = 0;
@@ -1158,7 +1044,7 @@
     o.metadata = buildResultSetMetadata();
     o.resumeToken = "foo";
     o.stats = buildResultSetStats();
-    o.values = buildUnnamed2129();
+    o.values = buildUnnamed2123();
   }
   buildCounterPartialResultSet--;
   return o;
@@ -1171,48 +1057,80 @@
     checkResultSetMetadata(o.metadata);
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     checkResultSetStats(o.stats);
-    checkUnnamed2129(o.values);
+    checkUnnamed2123(o.values);
   }
   buildCounterPartialResultSet--;
 }
 
-buildUnnamed2130() {
+buildUnnamed2124() {
   var o = new core.List<api.ChildLink>();
   o.add(buildChildLink());
   o.add(buildChildLink());
   return o;
 }
 
-checkUnnamed2130(core.List<api.ChildLink> o) {
+checkUnnamed2124(core.List<api.ChildLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildLink(o[0]);
   checkChildLink(o[1]);
 }
 
-buildUnnamed2131() {
+buildUnnamed2125() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2131(core.Map<core.String, core.Object> o) {
+checkUnnamed2125(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted19 = (o["x"]) as core.Map; unittest.expect(casted19, unittest.hasLength(3)); unittest.expect(casted19["list"], unittest.equals([1, 2, 3])); unittest.expect(casted19["bool"], unittest.equals(true)); unittest.expect(casted19["string"], unittest.equals('foo')); 
-  var casted20 = (o["y"]) as core.Map; unittest.expect(casted20, unittest.hasLength(3)); unittest.expect(casted20["list"], unittest.equals([1, 2, 3])); unittest.expect(casted20["bool"], unittest.equals(true)); unittest.expect(casted20["string"], unittest.equals('foo')); 
+  var casted19 = (o["x"]) as core.Map;
+  unittest.expect(casted19, unittest.hasLength(3));
+  unittest.expect(casted19["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted19["bool"], unittest.equals(true));
+  unittest.expect(casted19["string"], unittest.equals('foo'));
+  var casted20 = (o["y"]) as core.Map;
+  unittest.expect(casted20, unittest.hasLength(3));
+  unittest.expect(casted20["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted20["bool"], unittest.equals(true));
+  unittest.expect(casted20["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2132() {
+buildUnnamed2126() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2132(core.Map<core.String, core.Object> o) {
+checkUnnamed2126(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted21 = (o["x"]) as core.Map; unittest.expect(casted21, unittest.hasLength(3)); unittest.expect(casted21["list"], unittest.equals([1, 2, 3])); unittest.expect(casted21["bool"], unittest.equals(true)); unittest.expect(casted21["string"], unittest.equals('foo')); 
-  var casted22 = (o["y"]) as core.Map; unittest.expect(casted22, unittest.hasLength(3)); unittest.expect(casted22["list"], unittest.equals([1, 2, 3])); unittest.expect(casted22["bool"], unittest.equals(true)); unittest.expect(casted22["string"], unittest.equals('foo')); 
+  var casted21 = (o["x"]) as core.Map;
+  unittest.expect(casted21, unittest.hasLength(3));
+  unittest.expect(casted21["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted21["bool"], unittest.equals(true));
+  unittest.expect(casted21["string"], unittest.equals('foo'));
+  var casted22 = (o["y"]) as core.Map;
+  unittest.expect(casted22, unittest.hasLength(3));
+  unittest.expect(casted22["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted22["bool"], unittest.equals(true));
+  unittest.expect(casted22["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterPlanNode = 0;
@@ -1220,12 +1138,12 @@
   var o = new api.PlanNode();
   buildCounterPlanNode++;
   if (buildCounterPlanNode < 3) {
-    o.childLinks = buildUnnamed2130();
+    o.childLinks = buildUnnamed2124();
     o.displayName = "foo";
-    o.executionStats = buildUnnamed2131();
+    o.executionStats = buildUnnamed2125();
     o.index = 42;
     o.kind = "foo";
-    o.metadata = buildUnnamed2132();
+    o.metadata = buildUnnamed2126();
     o.shortRepresentation = buildShortRepresentation();
   }
   buildCounterPlanNode--;
@@ -1235,66 +1153,37 @@
 checkPlanNode(api.PlanNode o) {
   buildCounterPlanNode++;
   if (buildCounterPlanNode < 3) {
-    checkUnnamed2130(o.childLinks);
+    checkUnnamed2124(o.childLinks);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkUnnamed2131(o.executionStats);
+    checkUnnamed2125(o.executionStats);
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2132(o.metadata);
+    checkUnnamed2126(o.metadata);
     checkShortRepresentation(o.shortRepresentation);
   }
   buildCounterPlanNode--;
 }
 
-buildUnnamed2133() {
-  var o = new core.List<api.AuditConfig>();
-  o.add(buildAuditConfig());
-  o.add(buildAuditConfig());
-  return o;
-}
-
-checkUnnamed2133(core.List<api.AuditConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
-}
-
-buildUnnamed2134() {
+buildUnnamed2127() {
   var o = new core.List<api.Binding>();
   o.add(buildBinding());
   o.add(buildBinding());
   return o;
 }
 
-checkUnnamed2134(core.List<api.Binding> o) {
+checkUnnamed2127(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBinding(o[0]);
   checkBinding(o[1]);
 }
 
-buildUnnamed2135() {
-  var o = new core.List<api.Rule>();
-  o.add(buildRule());
-  o.add(buildRule());
-  return o;
-}
-
-checkUnnamed2135(core.List<api.Rule> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
-}
-
 core.int buildCounterPolicy = 0;
 buildPolicy() {
   var o = new api.Policy();
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    o.auditConfigs = buildUnnamed2133();
-    o.bindings = buildUnnamed2134();
+    o.bindings = buildUnnamed2127();
     o.etag = "foo";
-    o.iamOwned = true;
-    o.rules = buildUnnamed2135();
     o.version = 42;
   }
   buildCounterPolicy--;
@@ -1304,24 +1193,21 @@
 checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkUnnamed2133(o.auditConfigs);
-    checkUnnamed2134(o.bindings);
+    checkUnnamed2127(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
-    unittest.expect(o.iamOwned, unittest.isTrue);
-    checkUnnamed2135(o.rules);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterPolicy--;
 }
 
-buildUnnamed2136() {
+buildUnnamed2128() {
   var o = new core.List<api.PlanNode>();
   o.add(buildPlanNode());
   o.add(buildPlanNode());
   return o;
 }
 
-checkUnnamed2136(core.List<api.PlanNode> o) {
+checkUnnamed2128(core.List<api.PlanNode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlanNode(o[0]);
   checkPlanNode(o[1]);
@@ -1332,7 +1218,7 @@
   var o = new api.QueryPlan();
   buildCounterQueryPlan++;
   if (buildCounterQueryPlan < 3) {
-    o.planNodes = buildUnnamed2136();
+    o.planNodes = buildUnnamed2128();
   }
   buildCounterQueryPlan--;
   return o;
@@ -1341,7 +1227,7 @@
 checkQueryPlan(api.QueryPlan o) {
   buildCounterQueryPlan++;
   if (buildCounterQueryPlan < 3) {
-    checkUnnamed2136(o.planNodes);
+    checkUnnamed2128(o.planNodes);
   }
   buildCounterQueryPlan--;
 }
@@ -1375,14 +1261,14 @@
   buildCounterReadOnly--;
 }
 
-buildUnnamed2137() {
+buildUnnamed2129() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2137(core.List<core.String> o) {
+checkUnnamed2129(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1393,7 +1279,7 @@
   var o = new api.ReadRequest();
   buildCounterReadRequest++;
   if (buildCounterReadRequest < 3) {
-    o.columns = buildUnnamed2137();
+    o.columns = buildUnnamed2129();
     o.index = "foo";
     o.keySet = buildKeySet();
     o.limit = "foo";
@@ -1408,7 +1294,7 @@
 checkReadRequest(api.ReadRequest o) {
   buildCounterReadRequest++;
   if (buildCounterReadRequest < 3) {
-    checkUnnamed2137(o.columns);
+    checkUnnamed2129(o.columns);
     unittest.expect(o.index, unittest.equals('foo'));
     checkKeySet(o.keySet);
     unittest.expect(o.limit, unittest.equals('foo'));
@@ -1423,43 +1309,57 @@
 buildReadWrite() {
   var o = new api.ReadWrite();
   buildCounterReadWrite++;
-  if (buildCounterReadWrite < 3) {
-  }
+  if (buildCounterReadWrite < 3) {}
   buildCounterReadWrite--;
   return o;
 }
 
 checkReadWrite(api.ReadWrite o) {
   buildCounterReadWrite++;
-  if (buildCounterReadWrite < 3) {
-  }
+  if (buildCounterReadWrite < 3) {}
   buildCounterReadWrite--;
 }
 
-buildUnnamed2138() {
+buildUnnamed2130() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2138(core.List<core.Object> o) {
+checkUnnamed2130(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted23 = (o[0]) as core.Map; unittest.expect(casted23, unittest.hasLength(3)); unittest.expect(casted23["list"], unittest.equals([1, 2, 3])); unittest.expect(casted23["bool"], unittest.equals(true)); unittest.expect(casted23["string"], unittest.equals('foo')); 
-  var casted24 = (o[1]) as core.Map; unittest.expect(casted24, unittest.hasLength(3)); unittest.expect(casted24["list"], unittest.equals([1, 2, 3])); unittest.expect(casted24["bool"], unittest.equals(true)); unittest.expect(casted24["string"], unittest.equals('foo')); 
+  var casted23 = (o[0]) as core.Map;
+  unittest.expect(casted23, unittest.hasLength(3));
+  unittest.expect(casted23["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted23["bool"], unittest.equals(true));
+  unittest.expect(casted23["string"], unittest.equals('foo'));
+  var casted24 = (o[1]) as core.Map;
+  unittest.expect(casted24, unittest.hasLength(3));
+  unittest.expect(casted24["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted24["bool"], unittest.equals(true));
+  unittest.expect(casted24["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2139() {
+buildUnnamed2131() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2138());
-  o.add(buildUnnamed2138());
+  o.add(buildUnnamed2130());
+  o.add(buildUnnamed2130());
   return o;
 }
 
-checkUnnamed2139(core.List<core.List<core.Object>> o) {
+checkUnnamed2131(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2138(o[0]);
-  checkUnnamed2138(o[1]);
+  checkUnnamed2130(o[0]);
+  checkUnnamed2130(o[1]);
 }
 
 core.int buildCounterResultSet = 0;
@@ -1468,7 +1368,7 @@
   buildCounterResultSet++;
   if (buildCounterResultSet < 3) {
     o.metadata = buildResultSetMetadata();
-    o.rows = buildUnnamed2139();
+    o.rows = buildUnnamed2131();
     o.stats = buildResultSetStats();
   }
   buildCounterResultSet--;
@@ -1479,7 +1379,7 @@
   buildCounterResultSet++;
   if (buildCounterResultSet < 3) {
     checkResultSetMetadata(o.metadata);
-    checkUnnamed2139(o.rows);
+    checkUnnamed2131(o.rows);
     checkResultSetStats(o.stats);
   }
   buildCounterResultSet--;
@@ -1506,17 +1406,33 @@
   buildCounterResultSetMetadata--;
 }
 
-buildUnnamed2140() {
+buildUnnamed2132() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2140(core.Map<core.String, core.Object> o) {
+checkUnnamed2132(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted25 = (o["x"]) as core.Map; unittest.expect(casted25, unittest.hasLength(3)); unittest.expect(casted25["list"], unittest.equals([1, 2, 3])); unittest.expect(casted25["bool"], unittest.equals(true)); unittest.expect(casted25["string"], unittest.equals('foo')); 
-  var casted26 = (o["y"]) as core.Map; unittest.expect(casted26, unittest.hasLength(3)); unittest.expect(casted26["list"], unittest.equals([1, 2, 3])); unittest.expect(casted26["bool"], unittest.equals(true)); unittest.expect(casted26["string"], unittest.equals('foo')); 
+  var casted25 = (o["x"]) as core.Map;
+  unittest.expect(casted25, unittest.hasLength(3));
+  unittest.expect(casted25["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted25["bool"], unittest.equals(true));
+  unittest.expect(casted25["string"], unittest.equals('foo'));
+  var casted26 = (o["y"]) as core.Map;
+  unittest.expect(casted26, unittest.hasLength(3));
+  unittest.expect(casted26["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted26["bool"], unittest.equals(true));
+  unittest.expect(casted26["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterResultSetStats = 0;
@@ -1525,7 +1441,7 @@
   buildCounterResultSetStats++;
   if (buildCounterResultSetStats < 3) {
     o.queryPlan = buildQueryPlan();
-    o.queryStats = buildUnnamed2140();
+    o.queryStats = buildUnnamed2132();
   }
   buildCounterResultSetStats--;
   return o;
@@ -1535,7 +1451,7 @@
   buildCounterResultSetStats++;
   if (buildCounterResultSetStats < 3) {
     checkQueryPlan(o.queryPlan);
-    checkUnnamed2140(o.queryStats);
+    checkUnnamed2132(o.queryStats);
   }
   buildCounterResultSetStats--;
 }
@@ -1559,102 +1475,6 @@
   buildCounterRollbackRequest--;
 }
 
-buildUnnamed2141() {
-  var o = new core.List<api.Condition>();
-  o.add(buildCondition());
-  o.add(buildCondition());
-  return o;
-}
-
-checkUnnamed2141(core.List<api.Condition> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
-}
-
-buildUnnamed2142() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2142(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2143() {
-  var o = new core.List<api.LogConfig>();
-  o.add(buildLogConfig());
-  o.add(buildLogConfig());
-  return o;
-}
-
-checkUnnamed2143(core.List<api.LogConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkLogConfig(o[0]);
-  checkLogConfig(o[1]);
-}
-
-buildUnnamed2144() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2144(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed2145() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed2145(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterRule = 0;
-buildRule() {
-  var o = new api.Rule();
-  buildCounterRule++;
-  if (buildCounterRule < 3) {
-    o.action = "foo";
-    o.conditions = buildUnnamed2141();
-    o.description = "foo";
-    o.in_ = buildUnnamed2142();
-    o.logConfig = buildUnnamed2143();
-    o.notIn = buildUnnamed2144();
-    o.permissions = buildUnnamed2145();
-  }
-  buildCounterRule--;
-  return o;
-}
-
-checkRule(api.Rule o) {
-  buildCounterRule++;
-  if (buildCounterRule < 3) {
-    unittest.expect(o.action, unittest.equals('foo'));
-    checkUnnamed2141(o.conditions);
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2142(o.in_);
-    checkUnnamed2143(o.logConfig);
-    checkUnnamed2144(o.notIn);
-    checkUnnamed2145(o.permissions);
-  }
-  buildCounterRule--;
-}
-
 core.int buildCounterSession = 0;
 buildSession() {
   var o = new api.Session();
@@ -1680,7 +1500,6 @@
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
     o.policy = buildPolicy();
-    o.updateMask = "foo";
   }
   buildCounterSetIamPolicyRequest--;
   return o;
@@ -1690,19 +1509,18 @@
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
     checkPolicy(o.policy);
-    unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
 }
 
-buildUnnamed2146() {
+buildUnnamed2133() {
   var o = new core.Map<core.String, core.int>();
   o["x"] = 42;
   o["y"] = 42;
   return o;
 }
 
-checkUnnamed2146(core.Map<core.String, core.int> o) {
+checkUnnamed2133(core.Map<core.String, core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42));
   unittest.expect(o["y"], unittest.equals(42));
@@ -1714,7 +1532,7 @@
   buildCounterShortRepresentation++;
   if (buildCounterShortRepresentation < 3) {
     o.description = "foo";
-    o.subqueries = buildUnnamed2146();
+    o.subqueries = buildUnnamed2133();
   }
   buildCounterShortRepresentation--;
   return o;
@@ -1724,35 +1542,51 @@
   buildCounterShortRepresentation++;
   if (buildCounterShortRepresentation < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2146(o.subqueries);
+    checkUnnamed2133(o.subqueries);
   }
   buildCounterShortRepresentation--;
 }
 
-buildUnnamed2147() {
+buildUnnamed2134() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2147(core.Map<core.String, core.Object> o) {
+checkUnnamed2134(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted27 = (o["x"]) as core.Map; unittest.expect(casted27, unittest.hasLength(3)); unittest.expect(casted27["list"], unittest.equals([1, 2, 3])); unittest.expect(casted27["bool"], unittest.equals(true)); unittest.expect(casted27["string"], unittest.equals('foo')); 
-  var casted28 = (o["y"]) as core.Map; unittest.expect(casted28, unittest.hasLength(3)); unittest.expect(casted28["list"], unittest.equals([1, 2, 3])); unittest.expect(casted28["bool"], unittest.equals(true)); unittest.expect(casted28["string"], unittest.equals('foo')); 
+  var casted27 = (o["x"]) as core.Map;
+  unittest.expect(casted27, unittest.hasLength(3));
+  unittest.expect(casted27["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted27["bool"], unittest.equals(true));
+  unittest.expect(casted27["string"], unittest.equals('foo'));
+  var casted28 = (o["y"]) as core.Map;
+  unittest.expect(casted28, unittest.hasLength(3));
+  unittest.expect(casted28["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted28["bool"], unittest.equals(true));
+  unittest.expect(casted28["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2148() {
+buildUnnamed2135() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2147());
-  o.add(buildUnnamed2147());
+  o.add(buildUnnamed2134());
+  o.add(buildUnnamed2134());
   return o;
 }
 
-checkUnnamed2148(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2135(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2147(o[0]);
-  checkUnnamed2147(o[1]);
+  checkUnnamed2134(o[0]);
+  checkUnnamed2134(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1761,7 +1595,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2148();
+    o.details = buildUnnamed2135();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1772,20 +1606,20 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2148(o.details);
+    checkUnnamed2135(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
 }
 
-buildUnnamed2149() {
+buildUnnamed2136() {
   var o = new core.List<api.Field>();
   o.add(buildField());
   o.add(buildField());
   return o;
 }
 
-checkUnnamed2149(core.List<api.Field> o) {
+checkUnnamed2136(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkField(o[0]);
   checkField(o[1]);
@@ -1796,7 +1630,7 @@
   var o = new api.StructType();
   buildCounterStructType++;
   if (buildCounterStructType < 3) {
-    o.fields = buildUnnamed2149();
+    o.fields = buildUnnamed2136();
   }
   buildCounterStructType--;
   return o;
@@ -1805,19 +1639,19 @@
 checkStructType(api.StructType o) {
   buildCounterStructType++;
   if (buildCounterStructType < 3) {
-    checkUnnamed2149(o.fields);
+    checkUnnamed2136(o.fields);
   }
   buildCounterStructType--;
 }
 
-buildUnnamed2150() {
+buildUnnamed2137() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2150(core.List<core.String> o) {
+checkUnnamed2137(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1828,7 +1662,7 @@
   var o = new api.TestIamPermissionsRequest();
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed2150();
+    o.permissions = buildUnnamed2137();
   }
   buildCounterTestIamPermissionsRequest--;
   return o;
@@ -1837,19 +1671,19 @@
 checkTestIamPermissionsRequest(api.TestIamPermissionsRequest o) {
   buildCounterTestIamPermissionsRequest++;
   if (buildCounterTestIamPermissionsRequest < 3) {
-    checkUnnamed2150(o.permissions);
+    checkUnnamed2137(o.permissions);
   }
   buildCounterTestIamPermissionsRequest--;
 }
 
-buildUnnamed2151() {
+buildUnnamed2138() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2151(core.List<core.String> o) {
+checkUnnamed2138(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1860,7 +1694,7 @@
   var o = new api.TestIamPermissionsResponse();
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed2151();
+    o.permissions = buildUnnamed2138();
   }
   buildCounterTestIamPermissionsResponse--;
   return o;
@@ -1869,7 +1703,7 @@
 checkTestIamPermissionsResponse(api.TestIamPermissionsResponse o) {
   buildCounterTestIamPermissionsResponse++;
   if (buildCounterTestIamPermissionsResponse < 3) {
-    checkUnnamed2151(o.permissions);
+    checkUnnamed2138(o.permissions);
   }
   buildCounterTestIamPermissionsResponse--;
 }
@@ -1962,27 +1796,27 @@
   buildCounterType--;
 }
 
-buildUnnamed2152() {
+buildUnnamed2139() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2152(core.List<core.String> o) {
+checkUnnamed2139(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2153() {
+buildUnnamed2140() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2153(core.List<core.String> o) {
+checkUnnamed2140(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1993,9 +1827,9 @@
   var o = new api.UpdateDatabaseDdlMetadata();
   buildCounterUpdateDatabaseDdlMetadata++;
   if (buildCounterUpdateDatabaseDdlMetadata < 3) {
-    o.commitTimestamps = buildUnnamed2152();
+    o.commitTimestamps = buildUnnamed2139();
     o.database = "foo";
-    o.statements = buildUnnamed2153();
+    o.statements = buildUnnamed2140();
   }
   buildCounterUpdateDatabaseDdlMetadata--;
   return o;
@@ -2004,21 +1838,21 @@
 checkUpdateDatabaseDdlMetadata(api.UpdateDatabaseDdlMetadata o) {
   buildCounterUpdateDatabaseDdlMetadata++;
   if (buildCounterUpdateDatabaseDdlMetadata < 3) {
-    checkUnnamed2152(o.commitTimestamps);
+    checkUnnamed2139(o.commitTimestamps);
     unittest.expect(o.database, unittest.equals('foo'));
-    checkUnnamed2153(o.statements);
+    checkUnnamed2140(o.statements);
   }
   buildCounterUpdateDatabaseDdlMetadata--;
 }
 
-buildUnnamed2154() {
+buildUnnamed2141() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2154(core.List<core.String> o) {
+checkUnnamed2141(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2030,7 +1864,7 @@
   buildCounterUpdateDatabaseDdlRequest++;
   if (buildCounterUpdateDatabaseDdlRequest < 3) {
     o.operationId = "foo";
-    o.statements = buildUnnamed2154();
+    o.statements = buildUnnamed2141();
   }
   buildCounterUpdateDatabaseDdlRequest--;
   return o;
@@ -2040,7 +1874,7 @@
   buildCounterUpdateDatabaseDdlRequest++;
   if (buildCounterUpdateDatabaseDdlRequest < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkUnnamed2154(o.statements);
+    checkUnnamed2141(o.statements);
   }
   buildCounterUpdateDatabaseDdlRequest--;
 }
@@ -2091,43 +1925,59 @@
   buildCounterUpdateInstanceRequest--;
 }
 
-buildUnnamed2155() {
+buildUnnamed2142() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2155(core.List<core.String> o) {
+checkUnnamed2142(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2156() {
+buildUnnamed2143() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed2156(core.List<core.Object> o) {
+checkUnnamed2143(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted29 = (o[0]) as core.Map; unittest.expect(casted29, unittest.hasLength(3)); unittest.expect(casted29["list"], unittest.equals([1, 2, 3])); unittest.expect(casted29["bool"], unittest.equals(true)); unittest.expect(casted29["string"], unittest.equals('foo')); 
-  var casted30 = (o[1]) as core.Map; unittest.expect(casted30, unittest.hasLength(3)); unittest.expect(casted30["list"], unittest.equals([1, 2, 3])); unittest.expect(casted30["bool"], unittest.equals(true)); unittest.expect(casted30["string"], unittest.equals('foo')); 
+  var casted29 = (o[0]) as core.Map;
+  unittest.expect(casted29, unittest.hasLength(3));
+  unittest.expect(casted29["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted29["bool"], unittest.equals(true));
+  unittest.expect(casted29["string"], unittest.equals('foo'));
+  var casted30 = (o[1]) as core.Map;
+  unittest.expect(casted30, unittest.hasLength(3));
+  unittest.expect(casted30["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted30["bool"], unittest.equals(true));
+  unittest.expect(casted30["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2157() {
+buildUnnamed2144() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed2156());
-  o.add(buildUnnamed2156());
+  o.add(buildUnnamed2143());
+  o.add(buildUnnamed2143());
   return o;
 }
 
-checkUnnamed2157(core.List<core.List<core.Object>> o) {
+checkUnnamed2144(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2156(o[0]);
-  checkUnnamed2156(o[1]);
+  checkUnnamed2143(o[0]);
+  checkUnnamed2143(o[1]);
 }
 
 core.int buildCounterWrite = 0;
@@ -2135,9 +1985,9 @@
   var o = new api.Write();
   buildCounterWrite++;
   if (buildCounterWrite < 3) {
-    o.columns = buildUnnamed2155();
+    o.columns = buildUnnamed2142();
     o.table = "foo";
-    o.values = buildUnnamed2157();
+    o.values = buildUnnamed2144();
   }
   buildCounterWrite--;
   return o;
@@ -2146,42 +1996,14 @@
 checkWrite(api.Write o) {
   buildCounterWrite++;
   if (buildCounterWrite < 3) {
-    checkUnnamed2155(o.columns);
+    checkUnnamed2142(o.columns);
     unittest.expect(o.table, unittest.equals('foo'));
-    checkUnnamed2157(o.values);
+    checkUnnamed2144(o.values);
   }
   buildCounterWrite--;
 }
 
-
 main() {
-  unittest.group("obj-schema-AuditConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildAuditConfig();
-      var od = new api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-AuditLogConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildAuditLogConfig();
-      var od = new api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-AuthorizationLoggingOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildAuthorizationLoggingOptions();
-      var od = new api.AuthorizationLoggingOptions.fromJson(o.toJson());
-      checkAuthorizationLoggingOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-BeginTransactionRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBeginTransactionRequest();
@@ -2190,7 +2012,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Binding", () {
     unittest.test("to-json--from-json", () {
       var o = buildBinding();
@@ -2199,7 +2020,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChildLink", () {
     unittest.test("to-json--from-json", () {
       var o = buildChildLink();
@@ -2208,16 +2028,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-CloudAuditOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCloudAuditOptions();
-      var od = new api.CloudAuditOptions.fromJson(o.toJson());
-      checkCloudAuditOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-CommitRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitRequest();
@@ -2226,7 +2036,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommitResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommitResponse();
@@ -2235,25 +2044,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-Condition", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCondition();
-      var od = new api.Condition.fromJson(o.toJson());
-      checkCondition(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-CounterOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildCounterOptions();
-      var od = new api.CounterOptions.fromJson(o.toJson());
-      checkCounterOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-CreateDatabaseMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateDatabaseMetadata();
@@ -2262,7 +2052,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateDatabaseRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateDatabaseRequest();
@@ -2271,7 +2060,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateInstanceMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateInstanceMetadata();
@@ -2280,7 +2068,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CreateInstanceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCreateInstanceRequest();
@@ -2289,16 +2076,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-DataAccessOptions", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildDataAccessOptions();
-      var od = new api.DataAccessOptions.fromJson(o.toJson());
-      checkDataAccessOptions(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Database", () {
     unittest.test("to-json--from-json", () {
       var o = buildDatabase();
@@ -2307,7 +2084,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Delete", () {
     unittest.test("to-json--from-json", () {
       var o = buildDelete();
@@ -2316,7 +2092,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -2325,7 +2100,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ExecuteSqlRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildExecuteSqlRequest();
@@ -2334,16 +2108,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-Expr", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildExpr();
-      var od = new api.Expr.fromJson(o.toJson());
-      checkExpr(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Field", () {
     unittest.test("to-json--from-json", () {
       var o = buildField();
@@ -2352,7 +2116,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetDatabaseDdlResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetDatabaseDdlResponse();
@@ -2361,7 +2124,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildGetIamPolicyRequest();
@@ -2370,7 +2132,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Instance", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstance();
@@ -2379,7 +2140,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InstanceConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildInstanceConfig();
@@ -2388,7 +2148,6 @@
     });
   });
 
-
   unittest.group("obj-schema-KeyRange", () {
     unittest.test("to-json--from-json", () {
       var o = buildKeyRange();
@@ -2397,7 +2156,6 @@
     });
   });
 
-
   unittest.group("obj-schema-KeySet", () {
     unittest.test("to-json--from-json", () {
       var o = buildKeySet();
@@ -2406,7 +2164,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListDatabasesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListDatabasesResponse();
@@ -2415,7 +2172,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListInstanceConfigsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListInstanceConfigsResponse();
@@ -2424,7 +2180,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListInstancesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListInstancesResponse();
@@ -2433,7 +2188,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -2442,16 +2196,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-LogConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildLogConfig();
-      var od = new api.LogConfig.fromJson(o.toJson());
-      checkLogConfig(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Mutation", () {
     unittest.test("to-json--from-json", () {
       var o = buildMutation();
@@ -2460,7 +2204,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -2469,7 +2212,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PartialResultSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildPartialResultSet();
@@ -2478,7 +2220,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlanNode", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlanNode();
@@ -2487,7 +2228,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Policy", () {
     unittest.test("to-json--from-json", () {
       var o = buildPolicy();
@@ -2496,7 +2236,6 @@
     });
   });
 
-
   unittest.group("obj-schema-QueryPlan", () {
     unittest.test("to-json--from-json", () {
       var o = buildQueryPlan();
@@ -2505,7 +2244,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadOnly", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadOnly();
@@ -2514,7 +2252,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadRequest();
@@ -2523,7 +2260,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReadWrite", () {
     unittest.test("to-json--from-json", () {
       var o = buildReadWrite();
@@ -2532,7 +2268,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultSet", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultSet();
@@ -2541,7 +2276,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultSetMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultSetMetadata();
@@ -2550,7 +2284,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultSetStats", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultSetStats();
@@ -2559,7 +2292,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RollbackRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRollbackRequest();
@@ -2568,16 +2300,6 @@
     });
   });
 
-
-  unittest.group("obj-schema-Rule", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildRule();
-      var od = new api.Rule.fromJson(o.toJson());
-      checkRule(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Session", () {
     unittest.test("to-json--from-json", () {
       var o = buildSession();
@@ -2586,7 +2308,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SetIamPolicyRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSetIamPolicyRequest();
@@ -2595,7 +2316,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ShortRepresentation", () {
     unittest.test("to-json--from-json", () {
       var o = buildShortRepresentation();
@@ -2604,7 +2324,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -2613,7 +2332,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StructType", () {
     unittest.test("to-json--from-json", () {
       var o = buildStructType();
@@ -2622,7 +2340,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsRequest();
@@ -2631,7 +2348,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TestIamPermissionsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildTestIamPermissionsResponse();
@@ -2640,7 +2356,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Transaction", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransaction();
@@ -2649,7 +2364,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransactionOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransactionOptions();
@@ -2658,7 +2372,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransactionSelector", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransactionSelector();
@@ -2667,7 +2380,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Type", () {
     unittest.test("to-json--from-json", () {
       var o = buildType();
@@ -2676,7 +2388,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateDatabaseDdlMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateDatabaseDdlMetadata();
@@ -2685,7 +2396,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateDatabaseDdlRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateDatabaseDdlRequest();
@@ -2694,7 +2404,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateInstanceMetadata", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateInstanceMetadata();
@@ -2703,7 +2412,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateInstanceRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateInstanceRequest();
@@ -2712,7 +2420,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Write", () {
     unittest.test("to-json--from-json", () {
       var o = buildWrite();
@@ -2721,21 +2428,22 @@
     });
   });
 
-
   unittest.group("resource-ProjectsInstanceConfigsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstanceConfigsResourceApi res = new api.SpannerApi(mock).projects.instanceConfigs;
+      api.ProjectsInstanceConfigsResourceApi res =
+          new api.SpannerApi(mock).projects.instanceConfigs;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2749,29 +2457,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstanceConfig());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_name).then(unittest.expectAsync1(((api.InstanceConfig response) {
+      res
+          .get(arg_name)
+          .then(unittest.expectAsync1(((api.InstanceConfig response) {
         checkInstanceConfig(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstanceConfigsResourceApi res = new api.SpannerApi(mock).projects.instanceConfigs;
+      api.ProjectsInstanceConfigsResourceApi res =
+          new api.SpannerApi(mock).projects.instanceConfigs;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -2780,9 +2491,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2796,35 +2509,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListInstanceConfigsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListInstanceConfigsResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest
+              .expectAsync1(((api.ListInstanceConfigsResponse response) {
         checkListInstanceConfigsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsInstancesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_request = buildCreateInstanceRequest();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2835,9 +2552,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2851,38 +2570,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2896,16 +2620,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2916,18 +2641,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2941,16 +2668,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildInstance());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -2961,9 +2689,9 @@
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_request = buildGetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -2974,9 +2702,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -2990,29 +2720,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -3022,9 +2755,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3038,32 +2773,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListInstancesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListInstancesResponse response) {
+      res
+          .list(arg_parent,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              filter: arg_filter)
+          .then(unittest.expectAsync1(((api.ListInstancesResponse response) {
         checkListInstancesResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_request = buildUpdateInstanceRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3074,9 +2817,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3090,29 +2835,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_name).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .patch(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3123,9 +2871,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3139,29 +2889,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesResourceApi res = new api.SpannerApi(mock).projects.instances;
+      api.ProjectsInstancesResourceApi res =
+          new api.SpannerApi(mock).projects.instances;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3172,9 +2925,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3188,33 +2943,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsInstancesDatabasesResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_request = buildCreateDatabaseRequest();
       var arg_parent = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3225,9 +2980,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3241,38 +2998,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_parent).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .create(arg_request, arg_parent)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--dropDatabase", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_database = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3286,38 +3048,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.dropDatabase(arg_database).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .dropDatabase(arg_database)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3331,16 +3098,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildDatabase());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3351,18 +3119,20 @@
     });
 
     unittest.test("method--getDdl", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_database = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3376,29 +3146,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGetDatabaseDdlResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getDdl(arg_database).then(unittest.expectAsync1(((api.GetDatabaseDdlResponse response) {
+      res
+          .getDdl(arg_database)
+          .then(unittest.expectAsync1(((api.GetDatabaseDdlResponse response) {
         checkGetDatabaseDdlResponse(response);
       })));
     });
 
     unittest.test("method--getIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_request = buildGetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3409,9 +3182,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3425,29 +3200,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .getIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_parent = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
@@ -3456,9 +3234,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3472,31 +3252,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListDatabasesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListDatabasesResponse response) {
+      res
+          .list(arg_parent, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListDatabasesResponse response) {
         checkListDatabasesResponse(response);
       })));
     });
 
     unittest.test("method--setIamPolicy", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_request = buildSetIamPolicyRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3507,9 +3292,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3523,29 +3310,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPolicy());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setIamPolicy(arg_request, arg_resource).then(unittest.expectAsync1(((api.Policy response) {
+      res
+          .setIamPolicy(arg_request, arg_resource)
+          .then(unittest.expectAsync1(((api.Policy response) {
         checkPolicy(response);
       })));
     });
 
     unittest.test("method--testIamPermissions", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_request = buildTestIamPermissionsRequest();
       var arg_resource = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3556,9 +3346,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3572,29 +3364,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTestIamPermissionsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.testIamPermissions(arg_request, arg_resource).then(unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
+      res.testIamPermissions(arg_request, arg_resource).then(
+          unittest.expectAsync1(((api.TestIamPermissionsResponse response) {
         checkTestIamPermissionsResponse(response);
       })));
     });
 
     unittest.test("method--updateDdl", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesResourceApi res = new api.SpannerApi(mock).projects.instances.databases;
+      api.ProjectsInstancesDatabasesResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases;
       var arg_request = buildUpdateDatabaseDdlRequest();
       var arg_database = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3605,9 +3399,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3621,42 +3417,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.updateDdl(arg_request, arg_database).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .updateDdl(arg_request, arg_database)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
-
   });
 
-
-  unittest.group("resource-ProjectsInstancesDatabasesOperationsResourceApi", () {
+  unittest.group("resource-ProjectsInstancesDatabasesOperationsResourceApi",
+      () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.operations;
+      api.ProjectsInstancesDatabasesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3670,16 +3470,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3690,18 +3491,20 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.operations;
+      api.ProjectsInstancesDatabasesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3715,16 +3518,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3735,18 +3539,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.operations;
+      api.ProjectsInstancesDatabasesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3760,16 +3566,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -3780,21 +3587,23 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.operations;
+      api.ProjectsInstancesDatabasesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.operations;
       var arg_name = "foo";
+      var arg_filter = "foo";
       var arg_pageToken = "foo";
       var arg_pageSize = 42;
-      var arg_filter = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3808,36 +3617,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsInstancesDatabasesSessionsResourceApi", () {
     unittest.test("method--beginTransaction", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildBeginTransactionRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3848,9 +3663,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3864,29 +3681,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTransaction());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.beginTransaction(arg_request, arg_session).then(unittest.expectAsync1(((api.Transaction response) {
+      res
+          .beginTransaction(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.Transaction response) {
         checkTransaction(response);
       })));
     });
 
     unittest.test("method--commit", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildCommitRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -3897,9 +3717,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3913,38 +3735,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommitResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.commit(arg_request, arg_session).then(unittest.expectAsync1(((api.CommitResponse response) {
+      res
+          .commit(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.CommitResponse response) {
         checkCommitResponse(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_database = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -3958,38 +3785,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSession());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_database).then(unittest.expectAsync1(((api.Session response) {
+      res
+          .create(arg_database)
+          .then(unittest.expectAsync1(((api.Session response) {
         checkSession(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4003,16 +3835,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4023,9 +3856,9 @@
     });
 
     unittest.test("method--executeSql", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildExecuteSqlRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4036,9 +3869,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4052,29 +3887,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResultSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.executeSql(arg_request, arg_session).then(unittest.expectAsync1(((api.ResultSet response) {
+      res
+          .executeSql(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.ResultSet response) {
         checkResultSet(response);
       })));
     });
 
     unittest.test("method--executeStreamingSql", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildExecuteSqlRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4085,9 +3923,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4101,38 +3941,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPartialResultSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.executeStreamingSql(arg_request, arg_session).then(unittest.expectAsync1(((api.PartialResultSet response) {
+      res
+          .executeStreamingSql(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.PartialResultSet response) {
         checkPartialResultSet(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4146,16 +3991,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSession());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4166,9 +4012,9 @@
     });
 
     unittest.test("method--read", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildReadRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4179,9 +4025,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4195,29 +4043,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResultSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.read(arg_request, arg_session).then(unittest.expectAsync1(((api.ResultSet response) {
+      res
+          .read(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.ResultSet response) {
         checkResultSet(response);
       })));
     });
 
     unittest.test("method--rollback", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildRollbackRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4228,9 +4079,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4244,29 +4097,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.rollback(arg_request, arg_session).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .rollback(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--streamingRead", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesDatabasesSessionsResourceApi res = new api.SpannerApi(mock).projects.instances.databases.sessions;
+      api.ProjectsInstancesDatabasesSessionsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.databases.sessions;
       var arg_request = buildReadRequest();
       var arg_session = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -4277,9 +4133,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4293,42 +4151,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPartialResultSet());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.streamingRead(arg_request, arg_session).then(unittest.expectAsync1(((api.PartialResultSet response) {
+      res
+          .streamingRead(arg_request, arg_session)
+          .then(unittest.expectAsync1(((api.PartialResultSet response) {
         checkPartialResultSet(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ProjectsInstancesOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.operations;
+      api.ProjectsInstancesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4342,16 +4203,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4362,18 +4224,20 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.operations;
+      api.ProjectsInstancesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4387,16 +4251,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4407,18 +4272,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.operations;
+      api.ProjectsInstancesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.operations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4432,16 +4299,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -4452,9 +4320,9 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ProjectsInstancesOperationsResourceApi res = new api.SpannerApi(mock).projects.instances.operations;
+      api.ProjectsInstancesOperationsResourceApi res =
+          new api.SpannerApi(mock).projects.instances.operations;
       var arg_name = "foo";
       var arg_filter = "foo";
       var arg_pageToken = "foo";
@@ -4464,9 +4332,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -4480,30 +4350,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/speech/v1_test.dart b/generated/googleapis/test/speech/v1_test.dart
index dca3b85..59372fb 100644
--- a/generated/googleapis/test/speech/v1_test.dart
+++ b/generated/googleapis/test/speech/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.speech.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/speech/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -55,16 +54,14 @@
 buildCancelOperationRequest() {
   var o = new api.CancelOperationRequest();
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
   return o;
 }
 
 checkCancelOperationRequest(api.CancelOperationRequest o) {
   buildCounterCancelOperationRequest++;
-  if (buildCounterCancelOperationRequest < 3) {
-  }
+  if (buildCounterCancelOperationRequest < 3) {}
   buildCounterCancelOperationRequest--;
 }
 
@@ -72,27 +69,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed2707() {
+buildUnnamed2700() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed2707(core.List<api.Operation> o) {
+checkUnnamed2700(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -104,7 +99,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed2707();
+    o.operations = buildUnnamed2700();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -114,7 +109,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed2707(o.operations);
+    checkUnnamed2700(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
@@ -140,30 +135,62 @@
   buildCounterLongRunningRecognizeRequest--;
 }
 
-buildUnnamed2708() {
+buildUnnamed2701() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2708(core.Map<core.String, core.Object> o) {
+checkUnnamed2701(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2709() {
+buildUnnamed2702() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2709(core.Map<core.String, core.Object> o) {
+checkUnnamed2702(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -173,9 +200,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed2708();
+    o.metadata = buildUnnamed2701();
     o.name = "foo";
-    o.response = buildUnnamed2709();
+    o.response = buildUnnamed2702();
   }
   buildCounterOperation--;
   return o;
@@ -186,9 +213,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed2708(o.metadata);
+    checkUnnamed2701(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2709(o.response);
+    checkUnnamed2702(o.response);
   }
   buildCounterOperation--;
 }
@@ -214,14 +241,14 @@
   buildCounterRecognitionAudio--;
 }
 
-buildUnnamed2710() {
+buildUnnamed2703() {
   var o = new core.List<api.SpeechContext>();
   o.add(buildSpeechContext());
   o.add(buildSpeechContext());
   return o;
 }
 
-checkUnnamed2710(core.List<api.SpeechContext> o) {
+checkUnnamed2703(core.List<api.SpeechContext> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpeechContext(o[0]);
   checkSpeechContext(o[1]);
@@ -238,7 +265,7 @@
     o.maxAlternatives = 42;
     o.profanityFilter = true;
     o.sampleRateHertz = 42;
-    o.speechContexts = buildUnnamed2710();
+    o.speechContexts = buildUnnamed2703();
   }
   buildCounterRecognitionConfig--;
   return o;
@@ -253,7 +280,7 @@
     unittest.expect(o.maxAlternatives, unittest.equals(42));
     unittest.expect(o.profanityFilter, unittest.isTrue);
     unittest.expect(o.sampleRateHertz, unittest.equals(42));
-    checkUnnamed2710(o.speechContexts);
+    checkUnnamed2703(o.speechContexts);
   }
   buildCounterRecognitionConfig--;
 }
@@ -279,14 +306,14 @@
   buildCounterRecognizeRequest--;
 }
 
-buildUnnamed2711() {
+buildUnnamed2704() {
   var o = new core.List<api.SpeechRecognitionResult>();
   o.add(buildSpeechRecognitionResult());
   o.add(buildSpeechRecognitionResult());
   return o;
 }
 
-checkUnnamed2711(core.List<api.SpeechRecognitionResult> o) {
+checkUnnamed2704(core.List<api.SpeechRecognitionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpeechRecognitionResult(o[0]);
   checkSpeechRecognitionResult(o[1]);
@@ -297,7 +324,7 @@
   var o = new api.RecognizeResponse();
   buildCounterRecognizeResponse++;
   if (buildCounterRecognizeResponse < 3) {
-    o.results = buildUnnamed2711();
+    o.results = buildUnnamed2704();
   }
   buildCounterRecognizeResponse--;
   return o;
@@ -306,19 +333,19 @@
 checkRecognizeResponse(api.RecognizeResponse o) {
   buildCounterRecognizeResponse++;
   if (buildCounterRecognizeResponse < 3) {
-    checkUnnamed2711(o.results);
+    checkUnnamed2704(o.results);
   }
   buildCounterRecognizeResponse--;
 }
 
-buildUnnamed2712() {
+buildUnnamed2705() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2712(core.List<core.String> o) {
+checkUnnamed2705(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -329,7 +356,7 @@
   var o = new api.SpeechContext();
   buildCounterSpeechContext++;
   if (buildCounterSpeechContext < 3) {
-    o.phrases = buildUnnamed2712();
+    o.phrases = buildUnnamed2705();
   }
   buildCounterSpeechContext--;
   return o;
@@ -338,19 +365,19 @@
 checkSpeechContext(api.SpeechContext o) {
   buildCounterSpeechContext++;
   if (buildCounterSpeechContext < 3) {
-    checkUnnamed2712(o.phrases);
+    checkUnnamed2705(o.phrases);
   }
   buildCounterSpeechContext--;
 }
 
-buildUnnamed2713() {
+buildUnnamed2706() {
   var o = new core.List<api.WordInfo>();
   o.add(buildWordInfo());
   o.add(buildWordInfo());
   return o;
 }
 
-checkUnnamed2713(core.List<api.WordInfo> o) {
+checkUnnamed2706(core.List<api.WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWordInfo(o[0]);
   checkWordInfo(o[1]);
@@ -363,7 +390,7 @@
   if (buildCounterSpeechRecognitionAlternative < 3) {
     o.confidence = 42.0;
     o.transcript = "foo";
-    o.words = buildUnnamed2713();
+    o.words = buildUnnamed2706();
   }
   buildCounterSpeechRecognitionAlternative--;
   return o;
@@ -374,19 +401,19 @@
   if (buildCounterSpeechRecognitionAlternative < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.transcript, unittest.equals('foo'));
-    checkUnnamed2713(o.words);
+    checkUnnamed2706(o.words);
   }
   buildCounterSpeechRecognitionAlternative--;
 }
 
-buildUnnamed2714() {
+buildUnnamed2707() {
   var o = new core.List<api.SpeechRecognitionAlternative>();
   o.add(buildSpeechRecognitionAlternative());
   o.add(buildSpeechRecognitionAlternative());
   return o;
 }
 
-checkUnnamed2714(core.List<api.SpeechRecognitionAlternative> o) {
+checkUnnamed2707(core.List<api.SpeechRecognitionAlternative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSpeechRecognitionAlternative(o[0]);
   checkSpeechRecognitionAlternative(o[1]);
@@ -397,7 +424,7 @@
   var o = new api.SpeechRecognitionResult();
   buildCounterSpeechRecognitionResult++;
   if (buildCounterSpeechRecognitionResult < 3) {
-    o.alternatives = buildUnnamed2714();
+    o.alternatives = buildUnnamed2707();
   }
   buildCounterSpeechRecognitionResult--;
   return o;
@@ -406,35 +433,51 @@
 checkSpeechRecognitionResult(api.SpeechRecognitionResult o) {
   buildCounterSpeechRecognitionResult++;
   if (buildCounterSpeechRecognitionResult < 3) {
-    checkUnnamed2714(o.alternatives);
+    checkUnnamed2707(o.alternatives);
   }
   buildCounterSpeechRecognitionResult--;
 }
 
-buildUnnamed2715() {
+buildUnnamed2708() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed2715(core.Map<core.String, core.Object> o) {
+checkUnnamed2708(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed2716() {
+buildUnnamed2709() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed2715());
-  o.add(buildUnnamed2715());
+  o.add(buildUnnamed2708());
+  o.add(buildUnnamed2708());
   return o;
 }
 
-checkUnnamed2716(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed2709(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed2715(o[0]);
-  checkUnnamed2715(o[1]);
+  checkUnnamed2708(o[0]);
+  checkUnnamed2708(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -443,7 +486,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed2716();
+    o.details = buildUnnamed2709();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -454,7 +497,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed2716(o.details);
+    checkUnnamed2709(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -483,7 +526,6 @@
   buildCounterWordInfo--;
 }
 
-
 main() {
   unittest.group("obj-schema-CancelOperationRequest", () {
     unittest.test("to-json--from-json", () {
@@ -493,7 +535,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -502,7 +543,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -511,7 +551,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LongRunningRecognizeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildLongRunningRecognizeRequest();
@@ -520,7 +559,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -529,7 +567,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RecognitionAudio", () {
     unittest.test("to-json--from-json", () {
       var o = buildRecognitionAudio();
@@ -538,7 +575,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RecognitionConfig", () {
     unittest.test("to-json--from-json", () {
       var o = buildRecognitionConfig();
@@ -547,7 +583,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RecognizeRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRecognizeRequest();
@@ -556,7 +591,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RecognizeResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildRecognizeResponse();
@@ -565,7 +599,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SpeechContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildSpeechContext();
@@ -574,7 +607,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SpeechRecognitionAlternative", () {
     unittest.test("to-json--from-json", () {
       var o = buildSpeechRecognitionAlternative();
@@ -583,7 +615,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SpeechRecognitionResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildSpeechRecognitionResult();
@@ -592,7 +623,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -601,7 +631,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WordInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildWordInfo();
@@ -610,10 +639,8 @@
     });
   });
 
-
   unittest.group("resource-OperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.SpeechApi(mock).operations;
       var arg_request = buildCancelOperationRequest();
@@ -626,9 +653,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/operations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/operations/"));
         pathOffset += 14;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -642,27 +671,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.cancel(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .cancel(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.SpeechApi(mock).operations;
       var arg_name = "foo";
@@ -671,9 +702,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/operations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/operations/"));
         pathOffset += 14;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -687,16 +720,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -707,7 +741,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.SpeechApi(mock).operations;
       var arg_name = "foo";
@@ -716,9 +749,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/operations/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/operations/"));
         pathOffset += 14;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -732,16 +767,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -752,7 +788,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.OperationsResourceApi res = new api.SpeechApi(mock).operations;
       var arg_filter = "foo";
@@ -764,9 +799,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("v1/operations"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("v1/operations"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -779,35 +816,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
         unittest.expect(queryMap["name"].first, unittest.equals(arg_name));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(filter: arg_filter, pageToken: arg_pageToken, name: arg_name, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(
+              filter: arg_filter,
+              pageToken: arg_pageToken,
+              name: arg_name,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SpeechResourceApi", () {
     unittest.test("method--longrunningrecognize", () {
-
       var mock = new HttpServerMock();
       api.SpeechResourceApi res = new api.SpeechApi(mock).speech;
       var arg_request = buildLongRunningRecognizeRequest();
@@ -819,9 +862,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("v1/speech:longrunningrecognize"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 30),
+            unittest.equals("v1/speech:longrunningrecognize"));
         pathOffset += 30;
 
         var query = (req.url).query;
@@ -834,27 +879,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.longrunningrecognize(arg_request).then(unittest.expectAsync1(((api.Operation response) {
+      res
+          .longrunningrecognize(arg_request)
+          .then(unittest.expectAsync1(((api.Operation response) {
         checkOperation(response);
       })));
     });
 
     unittest.test("method--recognize", () {
-
       var mock = new HttpServerMock();
       api.SpeechResourceApi res = new api.SpeechApi(mock).speech;
       var arg_request = buildRecognizeRequest();
@@ -866,9 +913,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("v1/speech:recognize"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("v1/speech:recognize"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -881,27 +930,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildRecognizeResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.recognize(arg_request).then(unittest.expectAsync1(((api.RecognizeResponse response) {
+      res
+          .recognize(arg_request)
+          .then(unittest.expectAsync1(((api.RecognizeResponse response) {
         checkRecognizeResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/storagetransfer/v1_test.dart b/generated/googleapis/test/storagetransfer/v1_test.dart
index 4c9e178..9c15194 100644
--- a/generated/googleapis/test/storagetransfer/v1_test.dart
+++ b/generated/googleapis/test/storagetransfer/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.storagetransfer.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/storagetransfer/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -120,27 +119,25 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
-buildUnnamed1408() {
+buildUnnamed1398() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1408(core.List<core.String> o) {
+checkUnnamed1398(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -151,7 +148,7 @@
   var o = new api.ErrorLogEntry();
   buildCounterErrorLogEntry++;
   if (buildCounterErrorLogEntry < 3) {
-    o.errorDetails = buildUnnamed1408();
+    o.errorDetails = buildUnnamed1398();
     o.url = "foo";
   }
   buildCounterErrorLogEntry--;
@@ -161,20 +158,20 @@
 checkErrorLogEntry(api.ErrorLogEntry o) {
   buildCounterErrorLogEntry++;
   if (buildCounterErrorLogEntry < 3) {
-    checkUnnamed1408(o.errorDetails);
+    checkUnnamed1398(o.errorDetails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterErrorLogEntry--;
 }
 
-buildUnnamed1409() {
+buildUnnamed1399() {
   var o = new core.List<api.ErrorLogEntry>();
   o.add(buildErrorLogEntry());
   o.add(buildErrorLogEntry());
   return o;
 }
 
-checkUnnamed1409(core.List<api.ErrorLogEntry> o) {
+checkUnnamed1399(core.List<api.ErrorLogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorLogEntry(o[0]);
   checkErrorLogEntry(o[1]);
@@ -187,7 +184,7 @@
   if (buildCounterErrorSummary < 3) {
     o.errorCode = "foo";
     o.errorCount = "foo";
-    o.errorLogEntries = buildUnnamed1409();
+    o.errorLogEntries = buildUnnamed1399();
   }
   buildCounterErrorSummary--;
   return o;
@@ -198,7 +195,7 @@
   if (buildCounterErrorSummary < 3) {
     unittest.expect(o.errorCode, unittest.equals('foo'));
     unittest.expect(o.errorCount, unittest.equals('foo'));
-    checkUnnamed1409(o.errorLogEntries);
+    checkUnnamed1399(o.errorLogEntries);
   }
   buildCounterErrorSummary--;
 }
@@ -260,14 +257,14 @@
   buildCounterHttpData--;
 }
 
-buildUnnamed1410() {
+buildUnnamed1400() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1410(core.List<api.Operation> o) {
+checkUnnamed1400(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -279,7 +276,7 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     o.nextPageToken = "foo";
-    o.operations = buildUnnamed1410();
+    o.operations = buildUnnamed1400();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -289,19 +286,19 @@
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1410(o.operations);
+    checkUnnamed1400(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
 
-buildUnnamed1411() {
+buildUnnamed1401() {
   var o = new core.List<api.TransferJob>();
   o.add(buildTransferJob());
   o.add(buildTransferJob());
   return o;
 }
 
-checkUnnamed1411(core.List<api.TransferJob> o) {
+checkUnnamed1401(core.List<api.TransferJob> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTransferJob(o[0]);
   checkTransferJob(o[1]);
@@ -313,7 +310,7 @@
   buildCounterListTransferJobsResponse++;
   if (buildCounterListTransferJobsResponse < 3) {
     o.nextPageToken = "foo";
-    o.transferJobs = buildUnnamed1411();
+    o.transferJobs = buildUnnamed1401();
   }
   buildCounterListTransferJobsResponse--;
   return o;
@@ -323,32 +320,32 @@
   buildCounterListTransferJobsResponse++;
   if (buildCounterListTransferJobsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1411(o.transferJobs);
+    checkUnnamed1401(o.transferJobs);
   }
   buildCounterListTransferJobsResponse--;
 }
 
-buildUnnamed1412() {
+buildUnnamed1402() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1412(core.List<core.String> o) {
+checkUnnamed1402(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1413() {
+buildUnnamed1403() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1413(core.List<core.String> o) {
+checkUnnamed1403(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -359,8 +356,8 @@
   var o = new api.ObjectConditions();
   buildCounterObjectConditions++;
   if (buildCounterObjectConditions < 3) {
-    o.excludePrefixes = buildUnnamed1412();
-    o.includePrefixes = buildUnnamed1413();
+    o.excludePrefixes = buildUnnamed1402();
+    o.includePrefixes = buildUnnamed1403();
     o.maxTimeElapsedSinceLastModification = "foo";
     o.minTimeElapsedSinceLastModification = "foo";
   }
@@ -371,38 +368,72 @@
 checkObjectConditions(api.ObjectConditions o) {
   buildCounterObjectConditions++;
   if (buildCounterObjectConditions < 3) {
-    checkUnnamed1412(o.excludePrefixes);
-    checkUnnamed1413(o.includePrefixes);
-    unittest.expect(o.maxTimeElapsedSinceLastModification, unittest.equals('foo'));
-    unittest.expect(o.minTimeElapsedSinceLastModification, unittest.equals('foo'));
+    checkUnnamed1402(o.excludePrefixes);
+    checkUnnamed1403(o.includePrefixes);
+    unittest.expect(
+        o.maxTimeElapsedSinceLastModification, unittest.equals('foo'));
+    unittest.expect(
+        o.minTimeElapsedSinceLastModification, unittest.equals('foo'));
   }
   buildCounterObjectConditions--;
 }
 
-buildUnnamed1414() {
+buildUnnamed1404() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1414(core.Map<core.String, core.Object> o) {
+checkUnnamed1404(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1415() {
+buildUnnamed1405() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1415(core.Map<core.String, core.Object> o) {
+checkUnnamed1405(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted3 = (o["x"]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
-  var casted4 = (o["y"]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
+  var casted3 = (o["x"]) as core.Map;
+  unittest.expect(casted3, unittest.hasLength(3));
+  unittest.expect(casted3["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted3["bool"], unittest.equals(true));
+  unittest.expect(casted3["string"], unittest.equals('foo'));
+  var casted4 = (o["y"]) as core.Map;
+  unittest.expect(casted4, unittest.hasLength(3));
+  unittest.expect(casted4["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted4["bool"], unittest.equals(true));
+  unittest.expect(casted4["string"], unittest.equals('foo'));
 }
 
 core.int buildCounterOperation = 0;
@@ -412,9 +443,9 @@
   if (buildCounterOperation < 3) {
     o.done = true;
     o.error = buildStatus();
-    o.metadata = buildUnnamed1414();
+    o.metadata = buildUnnamed1404();
     o.name = "foo";
-    o.response = buildUnnamed1415();
+    o.response = buildUnnamed1405();
   }
   buildCounterOperation--;
   return o;
@@ -425,9 +456,9 @@
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkStatus(o.error);
-    checkUnnamed1414(o.metadata);
+    checkUnnamed1404(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1415(o.response);
+    checkUnnamed1405(o.response);
   }
   buildCounterOperation--;
 }
@@ -436,16 +467,14 @@
 buildPauseTransferOperationRequest() {
   var o = new api.PauseTransferOperationRequest();
   buildCounterPauseTransferOperationRequest++;
-  if (buildCounterPauseTransferOperationRequest < 3) {
-  }
+  if (buildCounterPauseTransferOperationRequest < 3) {}
   buildCounterPauseTransferOperationRequest--;
   return o;
 }
 
 checkPauseTransferOperationRequest(api.PauseTransferOperationRequest o) {
   buildCounterPauseTransferOperationRequest++;
-  if (buildCounterPauseTransferOperationRequest < 3) {
-  }
+  if (buildCounterPauseTransferOperationRequest < 3) {}
   buildCounterPauseTransferOperationRequest--;
 }
 
@@ -453,16 +482,14 @@
 buildResumeTransferOperationRequest() {
   var o = new api.ResumeTransferOperationRequest();
   buildCounterResumeTransferOperationRequest++;
-  if (buildCounterResumeTransferOperationRequest < 3) {
-  }
+  if (buildCounterResumeTransferOperationRequest < 3) {}
   buildCounterResumeTransferOperationRequest--;
   return o;
 }
 
 checkResumeTransferOperationRequest(api.ResumeTransferOperationRequest o) {
   buildCounterResumeTransferOperationRequest++;
-  if (buildCounterResumeTransferOperationRequest < 3) {
-  }
+  if (buildCounterResumeTransferOperationRequest < 3) {}
   buildCounterResumeTransferOperationRequest--;
 }
 
@@ -489,30 +516,46 @@
   buildCounterSchedule--;
 }
 
-buildUnnamed1416() {
+buildUnnamed1406() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1416(core.Map<core.String, core.Object> o) {
+checkUnnamed1406(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted5 = (o["x"]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
-  var casted6 = (o["y"]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
+  var casted5 = (o["x"]) as core.Map;
+  unittest.expect(casted5, unittest.hasLength(3));
+  unittest.expect(casted5["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted5["bool"], unittest.equals(true));
+  unittest.expect(casted5["string"], unittest.equals('foo'));
+  var casted6 = (o["y"]) as core.Map;
+  unittest.expect(casted6, unittest.hasLength(3));
+  unittest.expect(casted6["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted6["bool"], unittest.equals(true));
+  unittest.expect(casted6["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1417() {
+buildUnnamed1407() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1416());
-  o.add(buildUnnamed1416());
+  o.add(buildUnnamed1406());
+  o.add(buildUnnamed1406());
   return o;
 }
 
-checkUnnamed1417(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1407(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1416(o[0]);
-  checkUnnamed1416(o[1]);
+  checkUnnamed1406(o[0]);
+  checkUnnamed1406(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -521,7 +564,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1417();
+    o.details = buildUnnamed1407();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -532,7 +575,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1417(o.details);
+    checkUnnamed1407(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -647,14 +690,14 @@
   buildCounterTransferJob--;
 }
 
-buildUnnamed1418() {
+buildUnnamed1408() {
   var o = new core.List<api.ErrorSummary>();
   o.add(buildErrorSummary());
   o.add(buildErrorSummary());
   return o;
 }
 
-checkUnnamed1418(core.List<api.ErrorSummary> o) {
+checkUnnamed1408(core.List<api.ErrorSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorSummary(o[0]);
   checkErrorSummary(o[1]);
@@ -667,7 +710,7 @@
   if (buildCounterTransferOperation < 3) {
     o.counters = buildTransferCounters();
     o.endTime = "foo";
-    o.errorBreakdowns = buildUnnamed1418();
+    o.errorBreakdowns = buildUnnamed1408();
     o.name = "foo";
     o.projectId = "foo";
     o.startTime = "foo";
@@ -684,7 +727,7 @@
   if (buildCounterTransferOperation < 3) {
     checkTransferCounters(o.counters);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkUnnamed1418(o.errorBreakdowns);
+    checkUnnamed1408(o.errorBreakdowns);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -770,7 +813,6 @@
   buildCounterUpdateTransferJobRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AwsAccessKey", () {
     unittest.test("to-json--from-json", () {
@@ -780,7 +822,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AwsS3Data", () {
     unittest.test("to-json--from-json", () {
       var o = buildAwsS3Data();
@@ -789,7 +830,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Date", () {
     unittest.test("to-json--from-json", () {
       var o = buildDate();
@@ -798,7 +838,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -807,7 +846,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ErrorLogEntry", () {
     unittest.test("to-json--from-json", () {
       var o = buildErrorLogEntry();
@@ -816,7 +854,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ErrorSummary", () {
     unittest.test("to-json--from-json", () {
       var o = buildErrorSummary();
@@ -825,7 +862,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GcsData", () {
     unittest.test("to-json--from-json", () {
       var o = buildGcsData();
@@ -834,7 +870,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GoogleServiceAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildGoogleServiceAccount();
@@ -843,7 +878,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HttpData", () {
     unittest.test("to-json--from-json", () {
       var o = buildHttpData();
@@ -852,7 +886,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListOperationsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListOperationsResponse();
@@ -861,7 +894,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListTransferJobsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListTransferJobsResponse();
@@ -870,7 +902,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ObjectConditions", () {
     unittest.test("to-json--from-json", () {
       var o = buildObjectConditions();
@@ -879,7 +910,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Operation", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperation();
@@ -888,7 +918,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PauseTransferOperationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildPauseTransferOperationRequest();
@@ -897,7 +926,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResumeTransferOperationRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildResumeTransferOperationRequest();
@@ -906,7 +934,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Schedule", () {
     unittest.test("to-json--from-json", () {
       var o = buildSchedule();
@@ -915,7 +942,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -924,7 +950,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TimeOfDay", () {
     unittest.test("to-json--from-json", () {
       var o = buildTimeOfDay();
@@ -933,7 +958,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransferCounters", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransferCounters();
@@ -942,7 +966,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransferJob", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransferJob();
@@ -951,7 +974,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransferOperation", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransferOperation();
@@ -960,7 +982,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransferOptions", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransferOptions();
@@ -969,7 +990,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TransferSpec", () {
     unittest.test("to-json--from-json", () {
       var o = buildTransferSpec();
@@ -978,7 +998,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UpdateTransferJobRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUpdateTransferJobRequest();
@@ -987,21 +1006,22 @@
     });
   });
 
-
   unittest.group("resource-GoogleServiceAccountsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.GoogleServiceAccountsResourceApi res = new api.StoragetransferApi(mock).googleServiceAccounts;
+      api.GoogleServiceAccountsResourceApi res =
+          new api.StoragetransferApi(mock).googleServiceAccounts;
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("v1/googleServiceAccounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("v1/googleServiceAccounts/"));
         pathOffset += 25;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1017,33 +1037,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGoogleServiceAccount());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_projectId).then(unittest.expectAsync1(((api.GoogleServiceAccount response) {
+      res
+          .get(arg_projectId)
+          .then(unittest.expectAsync1(((api.GoogleServiceAccount response) {
         checkGoogleServiceAccount(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TransferJobsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.TransferJobsResourceApi res = new api.StoragetransferApi(mock).transferJobs;
+      api.TransferJobsResourceApi res =
+          new api.StoragetransferApi(mock).transferJobs;
       var arg_request = buildTransferJob();
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = new api.TransferJob.fromJson(json);
@@ -1053,9 +1074,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/transferJobs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/transferJobs"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -1068,29 +1091,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTransferJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.TransferJob response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.TransferJob response) {
         checkTransferJob(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TransferJobsResourceApi res = new api.StoragetransferApi(mock).transferJobs;
+      api.TransferJobsResourceApi res =
+          new api.StoragetransferApi(mock).transferJobs;
       var arg_jobName = "foo";
       var arg_projectId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1098,9 +1124,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1114,41 +1142,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projectId"].first, unittest.equals(arg_projectId));
-
+        unittest.expect(
+            queryMap["projectId"].first, unittest.equals(arg_projectId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTransferJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_jobName, projectId: arg_projectId).then(unittest.expectAsync1(((api.TransferJob response) {
+      res
+          .get(arg_jobName, projectId: arg_projectId)
+          .then(unittest.expectAsync1(((api.TransferJob response) {
         checkTransferJob(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TransferJobsResourceApi res = new api.StoragetransferApi(mock).transferJobs;
+      api.TransferJobsResourceApi res =
+          new api.StoragetransferApi(mock).transferJobs;
+      var arg_pageSize = 42;
       var arg_filter = "foo";
       var arg_pageToken = "foo";
-      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("v1/transferJobs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("v1/transferJobs"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -1161,32 +1195,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListTransferJobsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(filter: arg_filter, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListTransferJobsResponse response) {
+      res
+          .list(
+              pageSize: arg_pageSize,
+              filter: arg_filter,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListTransferJobsResponse response) {
         checkListTransferJobsResponse(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
-      api.TransferJobsResourceApi res = new api.StoragetransferApi(mock).transferJobs;
+      api.TransferJobsResourceApi res =
+          new api.StoragetransferApi(mock).transferJobs;
       var arg_request = buildUpdateTransferJobRequest();
       var arg_jobName = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1197,9 +1239,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1213,42 +1257,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTransferJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_jobName).then(unittest.expectAsync1(((api.TransferJob response) {
+      res
+          .patch(arg_request, arg_jobName)
+          .then(unittest.expectAsync1(((api.TransferJob response) {
         checkTransferJob(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TransferOperationsResourceApi", () {
     unittest.test("method--cancel", () {
-
       var mock = new HttpServerMock();
-      api.TransferOperationsResourceApi res = new api.StoragetransferApi(mock).transferOperations;
+      api.TransferOperationsResourceApi res =
+          new api.StoragetransferApi(mock).transferOperations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1262,16 +1309,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1282,18 +1330,20 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.TransferOperationsResourceApi res = new api.StoragetransferApi(mock).transferOperations;
+      api.TransferOperationsResourceApi res =
+          new api.StoragetransferApi(mock).transferOperations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1307,16 +1357,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1327,18 +1378,20 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.TransferOperationsResourceApi res = new api.StoragetransferApi(mock).transferOperations;
+      api.TransferOperationsResourceApi res =
+          new api.StoragetransferApi(mock).transferOperations;
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1352,16 +1405,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildOperation());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1372,21 +1426,23 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.TransferOperationsResourceApi res = new api.StoragetransferApi(mock).transferOperations;
+      api.TransferOperationsResourceApi res =
+          new api.StoragetransferApi(mock).transferOperations;
       var arg_name = "foo";
-      var arg_pageToken = "foo";
       var arg_pageSize = 42;
       var arg_filter = "foo";
+      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1400,32 +1456,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListOperationsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_name, pageToken: arg_pageToken, pageSize: arg_pageSize, filter: arg_filter).then(unittest.expectAsync1(((api.ListOperationsResponse response) {
+      res
+          .list(arg_name,
+              pageSize: arg_pageSize,
+              filter: arg_filter,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ListOperationsResponse response) {
         checkListOperationsResponse(response);
       })));
     });
 
     unittest.test("method--pause", () {
-
       var mock = new HttpServerMock();
-      api.TransferOperationsResourceApi res = new api.StoragetransferApi(mock).transferOperations;
+      api.TransferOperationsResourceApi res =
+          new api.StoragetransferApi(mock).transferOperations;
       var arg_request = buildPauseTransferOperationRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1436,9 +1500,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1452,29 +1518,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.pause(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .pause(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--resume", () {
-
       var mock = new HttpServerMock();
-      api.TransferOperationsResourceApi res = new api.StoragetransferApi(mock).transferOperations;
+      api.TransferOperationsResourceApi res =
+          new api.StoragetransferApi(mock).transferOperations;
       var arg_request = buildResumeTransferOperationRequest();
       var arg_name = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1485,9 +1554,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
         pathOffset += 3;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -1501,27 +1572,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.resume(arg_request, arg_name).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .resume(arg_request, arg_name)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/surveys/v2_test.dart b/generated/googleapis/test/surveys/v2_test.dart
index 085d269..e26813f 100644
--- a/generated/googleapis/test/surveys/v2_test.dart
+++ b/generated/googleapis/test/surveys/v2_test.dart
@@ -1,12 +1,10 @@
 library googleapis.surveys.v2.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/surveys/v2.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed2226() {
+buildUnnamed2213() {
   var o = new core.List<api.FieldMask>();
   o.add(buildFieldMask());
   o.add(buildFieldMask());
   return o;
 }
 
-checkUnnamed2226(core.List<api.FieldMask> o) {
+checkUnnamed2213(core.List<api.FieldMask> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFieldMask(o[0]);
   checkFieldMask(o[1]);
@@ -69,7 +68,7 @@
   var o = new api.FieldMask();
   buildCounterFieldMask++;
   if (buildCounterFieldMask < 3) {
-    o.fields = buildUnnamed2226();
+    o.fields = buildUnnamed2213();
     o.id = 42;
   }
   buildCounterFieldMask--;
@@ -79,20 +78,20 @@
 checkFieldMask(api.FieldMask o) {
   buildCounterFieldMask++;
   if (buildCounterFieldMask < 3) {
-    checkUnnamed2226(o.fields);
+    checkUnnamed2213(o.fields);
     unittest.expect(o.id, unittest.equals(42));
   }
   buildCounterFieldMask--;
 }
 
-buildUnnamed2227() {
+buildUnnamed2214() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2227(core.List<core.String> o) {
+checkUnnamed2214(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -108,7 +107,7 @@
     o.language = "foo";
     o.mobileAppPanelId = "foo";
     o.name = "foo";
-    o.owners = buildUnnamed2227();
+    o.owners = buildUnnamed2214();
   }
   buildCounterMobileAppPanel--;
   return o;
@@ -122,19 +121,19 @@
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed2227(o.owners);
+    checkUnnamed2214(o.owners);
   }
   buildCounterMobileAppPanel--;
 }
 
-buildUnnamed2228() {
+buildUnnamed2215() {
   var o = new core.List<api.MobileAppPanel>();
   o.add(buildMobileAppPanel());
   o.add(buildMobileAppPanel());
   return o;
 }
 
-checkUnnamed2228(core.List<api.MobileAppPanel> o) {
+checkUnnamed2215(core.List<api.MobileAppPanel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileAppPanel(o[0]);
   checkMobileAppPanel(o[1]);
@@ -147,7 +146,7 @@
   if (buildCounterMobileAppPanelsListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.requestId = "foo";
-    o.resources = buildUnnamed2228();
+    o.resources = buildUnnamed2215();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterMobileAppPanelsListResponse--;
@@ -159,7 +158,7 @@
   if (buildCounterMobileAppPanelsListResponse < 3) {
     checkPageInfo(o.pageInfo);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed2228(o.resources);
+    checkUnnamed2215(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterMobileAppPanelsListResponse--;
@@ -207,14 +206,14 @@
   buildCounterResultsGetRequest--;
 }
 
-buildUnnamed2229() {
+buildUnnamed2216() {
   var o = new core.List<api.FieldMask>();
   o.add(buildFieldMask());
   o.add(buildFieldMask());
   return o;
 }
 
-checkUnnamed2229(core.List<api.FieldMask> o) {
+checkUnnamed2216(core.List<api.FieldMask> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFieldMask(o[0]);
   checkFieldMask(o[1]);
@@ -225,7 +224,7 @@
   var o = new api.ResultsMask();
   buildCounterResultsMask++;
   if (buildCounterResultsMask < 3) {
-    o.fields = buildUnnamed2229();
+    o.fields = buildUnnamed2216();
     o.projection = "foo";
   }
   buildCounterResultsMask--;
@@ -235,33 +234,33 @@
 checkResultsMask(api.ResultsMask o) {
   buildCounterResultsMask++;
   if (buildCounterResultsMask < 3) {
-    checkUnnamed2229(o.fields);
+    checkUnnamed2216(o.fields);
     unittest.expect(o.projection, unittest.equals('foo'));
   }
   buildCounterResultsMask--;
 }
 
-buildUnnamed2230() {
+buildUnnamed2217() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2230(core.List<core.String> o) {
+checkUnnamed2217(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2231() {
+buildUnnamed2218() {
   var o = new core.List<api.SurveyQuestion>();
   o.add(buildSurveyQuestion());
   o.add(buildSurveyQuestion());
   return o;
 }
 
-checkUnnamed2231(core.List<api.SurveyQuestion> o) {
+checkUnnamed2218(core.List<api.SurveyQuestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurveyQuestion(o[0]);
   checkSurveyQuestion(o[1]);
@@ -276,8 +275,8 @@
     o.cost = buildSurveyCost();
     o.customerData = "foo";
     o.description = "foo";
-    o.owners = buildUnnamed2230();
-    o.questions = buildUnnamed2231();
+    o.owners = buildUnnamed2217();
+    o.questions = buildUnnamed2218();
     o.rejectionReason = buildSurveyRejection();
     o.state = "foo";
     o.surveyUrlId = "foo";
@@ -295,8 +294,8 @@
     checkSurveyCost(o.cost);
     unittest.expect(o.customerData, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed2230(o.owners);
-    checkUnnamed2231(o.questions);
+    checkUnnamed2217(o.owners);
+    checkUnnamed2218(o.questions);
     checkSurveyRejection(o.rejectionReason);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.surveyUrlId, unittest.equals('foo'));
@@ -306,27 +305,27 @@
   buildCounterSurvey--;
 }
 
-buildUnnamed2232() {
+buildUnnamed2219() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2232(core.List<core.String> o) {
+checkUnnamed2219(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2233() {
+buildUnnamed2220() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2233(core.List<core.String> o) {
+checkUnnamed2220(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -337,11 +336,11 @@
   var o = new api.SurveyAudience();
   buildCounterSurveyAudience++;
   if (buildCounterSurveyAudience < 3) {
-    o.ages = buildUnnamed2232();
+    o.ages = buildUnnamed2219();
     o.country = "foo";
     o.countrySubdivision = "foo";
     o.gender = "foo";
-    o.languages = buildUnnamed2233();
+    o.languages = buildUnnamed2220();
     o.mobileAppPanelId = "foo";
     o.populationSource = "foo";
   }
@@ -352,11 +351,11 @@
 checkSurveyAudience(api.SurveyAudience o) {
   buildCounterSurveyAudience++;
   if (buildCounterSurveyAudience < 3) {
-    checkUnnamed2232(o.ages);
+    checkUnnamed2219(o.ages);
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.countrySubdivision, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
-    checkUnnamed2233(o.languages);
+    checkUnnamed2220(o.languages);
     unittest.expect(o.mobileAppPanelId, unittest.equals('foo'));
     unittest.expect(o.populationSource, unittest.equals('foo'));
   }
@@ -388,53 +387,53 @@
   buildCounterSurveyCost--;
 }
 
-buildUnnamed2234() {
+buildUnnamed2221() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2234(core.List<core.String> o) {
+checkUnnamed2221(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2235() {
+buildUnnamed2222() {
   var o = new core.List<api.SurveyQuestionImage>();
   o.add(buildSurveyQuestionImage());
   o.add(buildSurveyQuestionImage());
   return o;
 }
 
-checkUnnamed2235(core.List<api.SurveyQuestionImage> o) {
+checkUnnamed2222(core.List<api.SurveyQuestionImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurveyQuestionImage(o[0]);
   checkSurveyQuestionImage(o[1]);
 }
 
-buildUnnamed2236() {
+buildUnnamed2223() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2236(core.List<core.String> o) {
+checkUnnamed2223(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed2237() {
+buildUnnamed2224() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed2237(core.List<core.String> o) {
+checkUnnamed2224(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -446,20 +445,20 @@
   buildCounterSurveyQuestion++;
   if (buildCounterSurveyQuestion < 3) {
     o.answerOrder = "foo";
-    o.answers = buildUnnamed2234();
+    o.answers = buildUnnamed2221();
     o.hasOther = true;
     o.highValueLabel = "foo";
-    o.images = buildUnnamed2235();
+    o.images = buildUnnamed2222();
     o.lastAnswerPositionPinned = true;
     o.lowValueLabel = "foo";
     o.mustPickSuggestion = true;
     o.numStars = "foo";
     o.openTextPlaceholder = "foo";
-    o.openTextSuggestions = buildUnnamed2236();
+    o.openTextSuggestions = buildUnnamed2223();
     o.question = "foo";
     o.sentimentText = "foo";
     o.singleLineResponse = true;
-    o.thresholdAnswers = buildUnnamed2237();
+    o.thresholdAnswers = buildUnnamed2224();
     o.type = "foo";
     o.unitOfMeasurementLabel = "foo";
     o.videoId = "foo";
@@ -472,20 +471,20 @@
   buildCounterSurveyQuestion++;
   if (buildCounterSurveyQuestion < 3) {
     unittest.expect(o.answerOrder, unittest.equals('foo'));
-    checkUnnamed2234(o.answers);
+    checkUnnamed2221(o.answers);
     unittest.expect(o.hasOther, unittest.isTrue);
     unittest.expect(o.highValueLabel, unittest.equals('foo'));
-    checkUnnamed2235(o.images);
+    checkUnnamed2222(o.images);
     unittest.expect(o.lastAnswerPositionPinned, unittest.isTrue);
     unittest.expect(o.lowValueLabel, unittest.equals('foo'));
     unittest.expect(o.mustPickSuggestion, unittest.isTrue);
     unittest.expect(o.numStars, unittest.equals('foo'));
     unittest.expect(o.openTextPlaceholder, unittest.equals('foo'));
-    checkUnnamed2236(o.openTextSuggestions);
+    checkUnnamed2223(o.openTextSuggestions);
     unittest.expect(o.question, unittest.equals('foo'));
     unittest.expect(o.sentimentText, unittest.equals('foo'));
     unittest.expect(o.singleLineResponse, unittest.isTrue);
-    checkUnnamed2237(o.thresholdAnswers);
+    checkUnnamed2224(o.thresholdAnswers);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unitOfMeasurementLabel, unittest.equals('foo'));
     unittest.expect(o.videoId, unittest.equals('foo'));
@@ -577,14 +576,14 @@
   buildCounterSurveysDeleteResponse--;
 }
 
-buildUnnamed2238() {
+buildUnnamed2225() {
   var o = new core.List<api.Survey>();
   o.add(buildSurvey());
   o.add(buildSurvey());
   return o;
 }
 
-checkUnnamed2238(core.List<api.Survey> o) {
+checkUnnamed2225(core.List<api.Survey> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSurvey(o[0]);
   checkSurvey(o[1]);
@@ -597,7 +596,7 @@
   if (buildCounterSurveysListResponse < 3) {
     o.pageInfo = buildPageInfo();
     o.requestId = "foo";
-    o.resources = buildUnnamed2238();
+    o.resources = buildUnnamed2225();
     o.tokenPagination = buildTokenPagination();
   }
   buildCounterSurveysListResponse--;
@@ -609,7 +608,7 @@
   if (buildCounterSurveysListResponse < 3) {
     checkPageInfo(o.pageInfo);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed2238(o.resources);
+    checkUnnamed2225(o.resources);
     checkTokenPagination(o.tokenPagination);
   }
   buildCounterSurveysListResponse--;
@@ -693,7 +692,6 @@
   buildCounterTokenPagination--;
 }
 
-
 main() {
   unittest.group("obj-schema-FieldMask", () {
     unittest.test("to-json--from-json", () {
@@ -703,7 +701,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileAppPanel", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileAppPanel();
@@ -712,7 +709,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MobileAppPanelsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildMobileAppPanelsListResponse();
@@ -721,7 +717,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageInfo();
@@ -730,7 +725,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultsGetRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultsGetRequest();
@@ -739,7 +733,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultsMask", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultsMask();
@@ -748,7 +741,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Survey", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurvey();
@@ -757,7 +749,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyAudience", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyAudience();
@@ -766,7 +757,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyCost", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyCost();
@@ -775,7 +765,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyQuestion", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyQuestion();
@@ -784,7 +773,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyQuestionImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyQuestionImage();
@@ -793,7 +781,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyRejection", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyRejection();
@@ -802,7 +789,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveyResults", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveyResults();
@@ -811,7 +797,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysDeleteResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysDeleteResponse();
@@ -820,7 +805,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysListResponse();
@@ -829,7 +813,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysStartRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysStartRequest();
@@ -838,7 +821,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysStartResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysStartResponse();
@@ -847,7 +829,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SurveysStopResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSurveysStopResponse();
@@ -856,7 +837,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TokenPagination", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokenPagination();
@@ -865,23 +845,25 @@
     });
   });
 
-
   unittest.group("resource-MobileapppanelsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res = new api.SurveysApi(mock).mobileapppanels;
+      api.MobileapppanelsResourceApi res =
+          new api.SurveysApi(mock).mobileapppanels;
       var arg_panelId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("mobileAppPanels/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("mobileAppPanels/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -897,29 +879,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileAppPanel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_panelId).then(unittest.expectAsync1(((api.MobileAppPanel response) {
+      res
+          .get(arg_panelId)
+          .then(unittest.expectAsync1(((api.MobileAppPanel response) {
         checkMobileAppPanel(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res = new api.SurveysApi(mock).mobileapppanels;
+      api.MobileapppanelsResourceApi res =
+          new api.SurveysApi(mock).mobileapppanels;
       var arg_maxResults = 42;
       var arg_startIndex = 42;
       var arg_token = "foo";
@@ -928,11 +913,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("mobileAppPanels"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("mobileAppPanels"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -945,32 +933,41 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileAppPanelsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, startIndex: arg_startIndex, token: arg_token).then(unittest.expectAsync1(((api.MobileAppPanelsListResponse response) {
+      res
+          .list(
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              token: arg_token)
+          .then(unittest
+              .expectAsync1(((api.MobileAppPanelsListResponse response) {
         checkMobileAppPanelsListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.MobileapppanelsResourceApi res = new api.SurveysApi(mock).mobileapppanels;
+      api.MobileapppanelsResourceApi res =
+          new api.SurveysApi(mock).mobileapppanels;
       var arg_request = buildMobileAppPanel();
       var arg_panelId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -981,11 +978,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("mobileAppPanels/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("mobileAppPanels/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1001,28 +1001,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMobileAppPanel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_panelId).then(unittest.expectAsync1(((api.MobileAppPanel response) {
+      res
+          .update(arg_request, arg_panelId)
+          .then(unittest.expectAsync1(((api.MobileAppPanel response) {
         checkMobileAppPanel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ResultsResourceApi", () {
     unittest.test("method--get", () {
       // TODO: Implement tests for media upload;
@@ -1040,18 +1041,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         index = path.indexOf("/results", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_surveyUrlId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/results"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/results"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -1064,31 +1070,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveyResults());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_request, arg_surveyUrlId).then(unittest.expectAsync1(((api.SurveyResults response) {
+      res
+          .get(arg_request, arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.SurveyResults response) {
         checkSurveyResults(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SurveysResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_surveyUrlId = "foo";
@@ -1097,11 +1103,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1117,27 +1126,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysDeleteResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_surveyUrlId).then(unittest.expectAsync1(((api.SurveysDeleteResponse response) {
+      res
+          .delete(arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.SurveysDeleteResponse response) {
         checkSurveysDeleteResponse(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_surveyUrlId = "foo";
@@ -1146,11 +1157,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1166,27 +1180,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurvey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_surveyUrlId).then(unittest.expectAsync1(((api.Survey response) {
+      res
+          .get(arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.Survey response) {
         checkSurvey(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_request = buildSurvey();
@@ -1198,11 +1214,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("surveys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("surveys"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1215,27 +1234,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurvey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.Survey response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.Survey response) {
         checkSurvey(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_maxResults = 42;
@@ -1246,11 +1267,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("surveys"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("surveys"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1263,30 +1287,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["startIndex"].first), unittest.equals(arg_startIndex));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["startIndex"].first),
+            unittest.equals(arg_startIndex));
         unittest.expect(queryMap["token"].first, unittest.equals(arg_token));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, startIndex: arg_startIndex, token: arg_token).then(unittest.expectAsync1(((api.SurveysListResponse response) {
+      res
+          .list(
+              maxResults: arg_maxResults,
+              startIndex: arg_startIndex,
+              token: arg_token)
+          .then(unittest.expectAsync1(((api.SurveysListResponse response) {
         checkSurveysListResponse(response);
       })));
     });
 
     unittest.test("method--start", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_request = buildSurveysStartRequest();
@@ -1299,18 +1330,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         index = path.indexOf("/start", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/start"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/start"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1323,27 +1359,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysStartResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.start(arg_request, arg_resourceId).then(unittest.expectAsync1(((api.SurveysStartResponse response) {
+      res
+          .start(arg_request, arg_resourceId)
+          .then(unittest.expectAsync1(((api.SurveysStartResponse response) {
         checkSurveysStartResponse(response);
       })));
     });
 
     unittest.test("method--stop", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_resourceId = "foo";
@@ -1352,18 +1390,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         index = path.indexOf("/stop", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_resourceId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/stop"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/stop"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1376,27 +1419,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurveysStopResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.stop(arg_resourceId).then(unittest.expectAsync1(((api.SurveysStopResponse response) {
+      res
+          .stop(arg_resourceId)
+          .then(unittest.expectAsync1(((api.SurveysStopResponse response) {
         checkSurveysStopResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.SurveysResourceApi res = new api.SurveysApi(mock).surveys;
       var arg_request = buildSurvey();
@@ -1409,11 +1454,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("surveys/v2/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("surveys/v2/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("surveys/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("surveys/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1429,27 +1477,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSurvey());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_surveyUrlId).then(unittest.expectAsync1(((api.Survey response) {
+      res
+          .update(arg_request, arg_surveyUrlId)
+          .then(unittest.expectAsync1(((api.Survey response) {
         checkSurvey(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index 53f1f97..e94e130 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.tasks.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/tasks/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -74,14 +73,14 @@
   buildCounterTaskLinks--;
 }
 
-buildUnnamed2717() {
+buildUnnamed2710() {
   var o = new core.List<api.TaskLinks>();
   o.add(buildTaskLinks());
   o.add(buildTaskLinks());
   return o;
 }
 
-checkUnnamed2717(core.List<api.TaskLinks> o) {
+checkUnnamed2710(core.List<api.TaskLinks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskLinks(o[0]);
   checkTaskLinks(o[1]);
@@ -99,7 +98,7 @@
     o.hidden = true;
     o.id = "foo";
     o.kind = "foo";
-    o.links = buildUnnamed2717();
+    o.links = buildUnnamed2710();
     o.notes = "foo";
     o.parent = "foo";
     o.position = "foo";
@@ -115,21 +114,24 @@
 checkTask(api.Task o) {
   buildCounterTask++;
   if (buildCounterTask < 3) {
-    unittest.expect(o.completed, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.completed,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.deleted, unittest.isTrue);
-    unittest.expect(o.due, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.due, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.hidden, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed2717(o.links);
+    checkUnnamed2710(o.links);
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterTask--;
 }
@@ -158,19 +160,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(
+        o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterTaskList--;
 }
 
-buildUnnamed2718() {
+buildUnnamed2711() {
   var o = new core.List<api.TaskList>();
   o.add(buildTaskList());
   o.add(buildTaskList());
   return o;
 }
 
-checkUnnamed2718(core.List<api.TaskList> o) {
+checkUnnamed2711(core.List<api.TaskList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskList(o[0]);
   checkTaskList(o[1]);
@@ -182,7 +185,7 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2718();
+    o.items = buildUnnamed2711();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -194,21 +197,21 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2718(o.items);
+    checkUnnamed2711(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterTaskLists--;
 }
 
-buildUnnamed2719() {
+buildUnnamed2712() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed2719(core.List<api.Task> o) {
+checkUnnamed2712(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -220,7 +223,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed2719();
+    o.items = buildUnnamed2712();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -232,14 +235,13 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed2719(o.items);
+    checkUnnamed2712(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterTasks--;
 }
 
-
 main() {
   unittest.group("obj-schema-TaskLinks", () {
     unittest.test("to-json--from-json", () {
@@ -249,7 +251,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Task", () {
     unittest.test("to-json--from-json", () {
       var o = buildTask();
@@ -258,7 +259,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TaskList", () {
     unittest.test("to-json--from-json", () {
       var o = buildTaskList();
@@ -267,7 +267,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TaskLists", () {
     unittest.test("to-json--from-json", () {
       var o = buildTaskLists();
@@ -276,7 +275,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Tasks", () {
     unittest.test("to-json--from-json", () {
       var o = buildTasks();
@@ -285,10 +283,8 @@
     });
   });
 
-
   unittest.group("resource-TasklistsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TasklistsResourceApi res = new api.TasksApi(mock).tasklists;
       var arg_tasklist = "foo";
@@ -297,11 +293,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -317,16 +316,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -335,7 +335,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TasklistsResourceApi res = new api.TasksApi(mock).tasklists;
       var arg_tasklist = "foo";
@@ -344,11 +343,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -364,27 +366,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tasklist).then(unittest.expectAsync1(((api.TaskList response) {
+      res
+          .get(arg_tasklist)
+          .then(unittest.expectAsync1(((api.TaskList response) {
         checkTaskList(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TasklistsResourceApi res = new api.TasksApi(mock).tasklists;
       var arg_request = buildTaskList();
@@ -396,11 +400,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("users/@me/lists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("users/@me/lists"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -413,27 +420,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request).then(unittest.expectAsync1(((api.TaskList response) {
+      res
+          .insert(arg_request)
+          .then(unittest.expectAsync1(((api.TaskList response) {
         checkTaskList(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TasklistsResourceApi res = new api.TasksApi(mock).tasklists;
       var arg_maxResults = "foo";
@@ -443,11 +452,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("users/@me/lists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("users/@me/lists"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -460,29 +472,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["maxResults"].first, unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["maxResults"].first, unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskLists());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.TaskLists response) {
+      res
+          .list(maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.TaskLists response) {
         checkTaskLists(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TasklistsResourceApi res = new api.TasksApi(mock).tasklists;
       var arg_request = buildTaskList();
@@ -495,11 +511,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -515,27 +534,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tasklist).then(unittest.expectAsync1(((api.TaskList response) {
+      res
+          .patch(arg_request, arg_tasklist)
+          .then(unittest.expectAsync1(((api.TaskList response) {
         checkTaskList(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TasklistsResourceApi res = new api.TasksApi(mock).tasklists;
       var arg_request = buildTaskList();
@@ -548,11 +569,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -568,31 +592,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTaskList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tasklist).then(unittest.expectAsync1(((api.TaskList response) {
+      res
+          .update(arg_request, arg_tasklist)
+          .then(unittest.expectAsync1(((api.TaskList response) {
         checkTaskList(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-TasksResourceApi", () {
     unittest.test("method--clear", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_tasklist = "foo";
@@ -601,18 +625,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/clear", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/clear"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/clear"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -625,16 +654,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -643,7 +673,6 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_tasklist = "foo";
@@ -653,18 +682,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -680,16 +714,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -698,7 +733,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_tasklist = "foo";
@@ -708,18 +742,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -735,27 +774,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_tasklist, arg_task).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .get(arg_tasklist, arg_task)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_request = buildTask();
@@ -770,18 +811,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tasks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/tasks"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -794,29 +840,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
-        unittest.expect(queryMap["previous"].first, unittest.equals(arg_previous));
-
+        unittest.expect(
+            queryMap["previous"].first, unittest.equals(arg_previous));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_tasklist, parent: arg_parent, previous: arg_previous).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .insert(arg_request, arg_tasklist,
+              parent: arg_parent, previous: arg_previous)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_tasklist = "foo";
@@ -835,18 +885,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tasks"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/tasks"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -859,37 +914,57 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["completedMax"].first, unittest.equals(arg_completedMax));
-        unittest.expect(queryMap["completedMin"].first, unittest.equals(arg_completedMin));
+        unittest.expect(
+            queryMap["completedMax"].first, unittest.equals(arg_completedMax));
+        unittest.expect(
+            queryMap["completedMin"].first, unittest.equals(arg_completedMin));
         unittest.expect(queryMap["dueMax"].first, unittest.equals(arg_dueMax));
         unittest.expect(queryMap["dueMin"].first, unittest.equals(arg_dueMin));
-        unittest.expect(queryMap["maxResults"].first, unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["showCompleted"].first, unittest.equals("$arg_showCompleted"));
-        unittest.expect(queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
-        unittest.expect(queryMap["showHidden"].first, unittest.equals("$arg_showHidden"));
-        unittest.expect(queryMap["updatedMin"].first, unittest.equals(arg_updatedMin));
-
+        unittest.expect(
+            queryMap["maxResults"].first, unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["showCompleted"].first,
+            unittest.equals("$arg_showCompleted"));
+        unittest.expect(
+            queryMap["showDeleted"].first, unittest.equals("$arg_showDeleted"));
+        unittest.expect(
+            queryMap["showHidden"].first, unittest.equals("$arg_showHidden"));
+        unittest.expect(
+            queryMap["updatedMin"].first, unittest.equals(arg_updatedMin));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTasks());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_tasklist, completedMax: arg_completedMax, completedMin: arg_completedMin, dueMax: arg_dueMax, dueMin: arg_dueMin, maxResults: arg_maxResults, pageToken: arg_pageToken, showCompleted: arg_showCompleted, showDeleted: arg_showDeleted, showHidden: arg_showHidden, updatedMin: arg_updatedMin).then(unittest.expectAsync1(((api.Tasks response) {
+      res
+          .list(arg_tasklist,
+              completedMax: arg_completedMax,
+              completedMin: arg_completedMin,
+              dueMax: arg_dueMax,
+              dueMin: arg_dueMin,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              showCompleted: arg_showCompleted,
+              showDeleted: arg_showDeleted,
+              showHidden: arg_showHidden,
+              updatedMin: arg_updatedMin)
+          .then(unittest.expectAsync1(((api.Tasks response) {
         checkTasks(response);
       })));
     });
 
     unittest.test("method--move", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_tasklist = "foo";
@@ -901,25 +976,32 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         index = path.indexOf("/move", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_task"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/move"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("/move"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -932,29 +1014,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["parent"].first, unittest.equals(arg_parent));
-        unittest.expect(queryMap["previous"].first, unittest.equals(arg_previous));
-
+        unittest.expect(
+            queryMap["previous"].first, unittest.equals(arg_previous));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.move(arg_tasklist, arg_task, parent: arg_parent, previous: arg_previous).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .move(arg_tasklist, arg_task,
+              parent: arg_parent, previous: arg_previous)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--patch", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_request = buildTask();
@@ -968,18 +1054,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -995,27 +1086,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_tasklist, arg_task).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .patch(arg_request, arg_tasklist, arg_task)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.TasksResourceApi res = new api.TasksApi(mock).tasks;
       var arg_request = buildTask();
@@ -1029,18 +1122,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("tasks/v1/"));
         pathOffset += 9;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_tasklist"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/tasks/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1056,27 +1154,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildTask());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_tasklist, arg_task).then(unittest.expectAsync1(((api.Task response) {
+      res
+          .update(arg_request, arg_tasklist, arg_task)
+          .then(unittest.expectAsync1(((api.Task response) {
         checkTask(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/urlshortener/v1_test.dart b/generated/googleapis/test/urlshortener/v1_test.dart
index 0926c26..697e45d 100644
--- a/generated/googleapis/test/urlshortener/v1_test.dart
+++ b/generated/googleapis/test/urlshortener/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.urlshortener.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/urlshortener/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,51 +44,12 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed787() {
-  var o = new core.List<api.StringCount>();
-  o.add(buildStringCount());
-  o.add(buildStringCount());
-  return o;
-}
-
-checkUnnamed787(core.List<api.StringCount> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkStringCount(o[0]);
-  checkStringCount(o[1]);
-}
-
-buildUnnamed788() {
-  var o = new core.List<api.StringCount>();
-  o.add(buildStringCount());
-  o.add(buildStringCount());
-  return o;
-}
-
-checkUnnamed788(core.List<api.StringCount> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkStringCount(o[0]);
-  checkStringCount(o[1]);
-}
-
-buildUnnamed789() {
-  var o = new core.List<api.StringCount>();
-  o.add(buildStringCount());
-  o.add(buildStringCount());
-  return o;
-}
-
-checkUnnamed789(core.List<api.StringCount> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkStringCount(o[0]);
-  checkStringCount(o[1]);
-}
-
 buildUnnamed790() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
@@ -103,16 +63,55 @@
   checkStringCount(o[1]);
 }
 
+buildUnnamed791() {
+  var o = new core.List<api.StringCount>();
+  o.add(buildStringCount());
+  o.add(buildStringCount());
+  return o;
+}
+
+checkUnnamed791(core.List<api.StringCount> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkStringCount(o[0]);
+  checkStringCount(o[1]);
+}
+
+buildUnnamed792() {
+  var o = new core.List<api.StringCount>();
+  o.add(buildStringCount());
+  o.add(buildStringCount());
+  return o;
+}
+
+checkUnnamed792(core.List<api.StringCount> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkStringCount(o[0]);
+  checkStringCount(o[1]);
+}
+
+buildUnnamed793() {
+  var o = new core.List<api.StringCount>();
+  o.add(buildStringCount());
+  o.add(buildStringCount());
+  return o;
+}
+
+checkUnnamed793(core.List<api.StringCount> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkStringCount(o[0]);
+  checkStringCount(o[1]);
+}
+
 core.int buildCounterAnalyticsSnapshot = 0;
 buildAnalyticsSnapshot() {
   var o = new api.AnalyticsSnapshot();
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    o.browsers = buildUnnamed787();
-    o.countries = buildUnnamed788();
+    o.browsers = buildUnnamed790();
+    o.countries = buildUnnamed791();
     o.longUrlClicks = "foo";
-    o.platforms = buildUnnamed789();
-    o.referrers = buildUnnamed790();
+    o.platforms = buildUnnamed792();
+    o.referrers = buildUnnamed793();
     o.shortUrlClicks = "foo";
   }
   buildCounterAnalyticsSnapshot--;
@@ -122,11 +121,11 @@
 checkAnalyticsSnapshot(api.AnalyticsSnapshot o) {
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    checkUnnamed787(o.browsers);
-    checkUnnamed788(o.countries);
+    checkUnnamed790(o.browsers);
+    checkUnnamed791(o.countries);
     unittest.expect(o.longUrlClicks, unittest.equals('foo'));
-    checkUnnamed789(o.platforms);
-    checkUnnamed790(o.referrers);
+    checkUnnamed792(o.platforms);
+    checkUnnamed793(o.referrers);
     unittest.expect(o.shortUrlClicks, unittest.equals('foo'));
   }
   buildCounterAnalyticsSnapshot--;
@@ -209,14 +208,14 @@
   buildCounterUrl--;
 }
 
-buildUnnamed791() {
+buildUnnamed794() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed791(core.List<api.Url> o) {
+checkUnnamed794(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
@@ -227,7 +226,7 @@
   var o = new api.UrlHistory();
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    o.items = buildUnnamed791();
+    o.items = buildUnnamed794();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -240,7 +239,7 @@
 checkUrlHistory(api.UrlHistory o) {
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    checkUnnamed791(o.items);
+    checkUnnamed794(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -249,7 +248,6 @@
   buildCounterUrlHistory--;
 }
 
-
 main() {
   unittest.group("obj-schema-AnalyticsSnapshot", () {
     unittest.test("to-json--from-json", () {
@@ -259,7 +257,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnalyticsSummary", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnalyticsSummary();
@@ -268,7 +265,6 @@
     });
   });
 
-
   unittest.group("obj-schema-StringCount", () {
     unittest.test("to-json--from-json", () {
       var o = buildStringCount();
@@ -277,7 +273,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Url", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrl();
@@ -286,7 +281,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlHistory", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlHistory();
@@ -295,10 +289,8 @@
     });
   });
 
-
   unittest.group("resource-UrlResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.UrlResourceApi res = new api.UrlshortenerApi(mock).url;
       var arg_shortUrl = "foo";
@@ -308,11 +300,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("urlshortener/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("urlshortener/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("url"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("url"));
         pathOffset += 3;
 
         var query = (req.url).query;
@@ -325,29 +320,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["shortUrl"].first, unittest.equals(arg_shortUrl));
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-
+        unittest.expect(
+            queryMap["shortUrl"].first, unittest.equals(arg_shortUrl));
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrl());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_shortUrl, projection: arg_projection).then(unittest.expectAsync1(((api.Url response) {
+      res
+          .get(arg_shortUrl, projection: arg_projection)
+          .then(unittest.expectAsync1(((api.Url response) {
         checkUrl(response);
       })));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.UrlResourceApi res = new api.UrlshortenerApi(mock).url;
       var arg_request = buildUrl();
@@ -359,11 +358,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("urlshortener/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("urlshortener/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("url"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("url"));
         pathOffset += 3;
 
         var query = (req.url).query;
@@ -376,16 +378,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrl());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -396,7 +399,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.UrlResourceApi res = new api.UrlshortenerApi(mock).url;
       var arg_projection = "foo";
@@ -406,11 +408,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("urlshortener/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("urlshortener/v1/"));
         pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("url/history"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("url/history"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -423,29 +428,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
-        unittest.expect(queryMap["start-token"].first, unittest.equals(arg_start_token));
-
+        unittest.expect(
+            queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(
+            queryMap["start-token"].first, unittest.equals(arg_start_token));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrlHistory());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(projection: arg_projection, start_token: arg_start_token).then(unittest.expectAsync1(((api.UrlHistory response) {
+      res
+          .list(projection: arg_projection, start_token: arg_start_token)
+          .then(unittest.expectAsync1(((api.UrlHistory response) {
         checkUrlHistory(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/vault/v1_test.dart b/generated/googleapis/test/vault/v1_test.dart
index 22db4de..950dcdb 100644
--- a/generated/googleapis/test/vault/v1_test.dart
+++ b/generated/googleapis/test/vault/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.vault.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/vault/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -78,16 +77,14 @@
 buildCloseMatterRequest() {
   var o = new api.CloseMatterRequest();
   buildCounterCloseMatterRequest++;
-  if (buildCounterCloseMatterRequest < 3) {
-  }
+  if (buildCounterCloseMatterRequest < 3) {}
   buildCounterCloseMatterRequest--;
   return o;
 }
 
 checkCloseMatterRequest(api.CloseMatterRequest o) {
   buildCounterCloseMatterRequest++;
-  if (buildCounterCloseMatterRequest < 3) {
-  }
+  if (buildCounterCloseMatterRequest < 3) {}
   buildCounterCloseMatterRequest--;
 }
 
@@ -137,16 +134,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -257,14 +252,14 @@
   buildCounterHeldOrgUnit--;
 }
 
-buildUnnamed1637() {
+buildUnnamed1633() {
   var o = new core.List<api.HeldAccount>();
   o.add(buildHeldAccount());
   o.add(buildHeldAccount());
   return o;
 }
 
-checkUnnamed1637(core.List<api.HeldAccount> o) {
+checkUnnamed1633(core.List<api.HeldAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeldAccount(o[0]);
   checkHeldAccount(o[1]);
@@ -275,7 +270,7 @@
   var o = new api.Hold();
   buildCounterHold++;
   if (buildCounterHold < 3) {
-    o.accounts = buildUnnamed1637();
+    o.accounts = buildUnnamed1633();
     o.corpus = "foo";
     o.holdId = "foo";
     o.name = "foo";
@@ -290,7 +285,7 @@
 checkHold(api.Hold o) {
   buildCounterHold++;
   if (buildCounterHold < 3) {
-    checkUnnamed1637(o.accounts);
+    checkUnnamed1633(o.accounts);
     unittest.expect(o.corpus, unittest.equals('foo'));
     unittest.expect(o.holdId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -301,14 +296,14 @@
   buildCounterHold--;
 }
 
-buildUnnamed1638() {
+buildUnnamed1634() {
   var o = new core.List<api.HeldAccount>();
   o.add(buildHeldAccount());
   o.add(buildHeldAccount());
   return o;
 }
 
-checkUnnamed1638(core.List<api.HeldAccount> o) {
+checkUnnamed1634(core.List<api.HeldAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeldAccount(o[0]);
   checkHeldAccount(o[1]);
@@ -319,7 +314,7 @@
   var o = new api.ListHeldAccountsResponse();
   buildCounterListHeldAccountsResponse++;
   if (buildCounterListHeldAccountsResponse < 3) {
-    o.accounts = buildUnnamed1638();
+    o.accounts = buildUnnamed1634();
   }
   buildCounterListHeldAccountsResponse--;
   return o;
@@ -328,19 +323,19 @@
 checkListHeldAccountsResponse(api.ListHeldAccountsResponse o) {
   buildCounterListHeldAccountsResponse++;
   if (buildCounterListHeldAccountsResponse < 3) {
-    checkUnnamed1638(o.accounts);
+    checkUnnamed1634(o.accounts);
   }
   buildCounterListHeldAccountsResponse--;
 }
 
-buildUnnamed1639() {
+buildUnnamed1635() {
   var o = new core.List<api.Hold>();
   o.add(buildHold());
   o.add(buildHold());
   return o;
 }
 
-checkUnnamed1639(core.List<api.Hold> o) {
+checkUnnamed1635(core.List<api.Hold> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHold(o[0]);
   checkHold(o[1]);
@@ -351,7 +346,7 @@
   var o = new api.ListHoldsResponse();
   buildCounterListHoldsResponse++;
   if (buildCounterListHoldsResponse < 3) {
-    o.holds = buildUnnamed1639();
+    o.holds = buildUnnamed1635();
     o.nextPageToken = "foo";
   }
   buildCounterListHoldsResponse--;
@@ -361,20 +356,20 @@
 checkListHoldsResponse(api.ListHoldsResponse o) {
   buildCounterListHoldsResponse++;
   if (buildCounterListHoldsResponse < 3) {
-    checkUnnamed1639(o.holds);
+    checkUnnamed1635(o.holds);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHoldsResponse--;
 }
 
-buildUnnamed1640() {
+buildUnnamed1636() {
   var o = new core.List<api.Matter>();
   o.add(buildMatter());
   o.add(buildMatter());
   return o;
 }
 
-checkUnnamed1640(core.List<api.Matter> o) {
+checkUnnamed1636(core.List<api.Matter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMatter(o[0]);
   checkMatter(o[1]);
@@ -385,7 +380,7 @@
   var o = new api.ListMattersResponse();
   buildCounterListMattersResponse++;
   if (buildCounterListMattersResponse < 3) {
-    o.matters = buildUnnamed1640();
+    o.matters = buildUnnamed1636();
     o.nextPageToken = "foo";
   }
   buildCounterListMattersResponse--;
@@ -395,20 +390,20 @@
 checkListMattersResponse(api.ListMattersResponse o) {
   buildCounterListMattersResponse++;
   if (buildCounterListMattersResponse < 3) {
-    checkUnnamed1640(o.matters);
+    checkUnnamed1636(o.matters);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMattersResponse--;
 }
 
-buildUnnamed1641() {
+buildUnnamed1637() {
   var o = new core.List<api.MatterPermission>();
   o.add(buildMatterPermission());
   o.add(buildMatterPermission());
   return o;
 }
 
-checkUnnamed1641(core.List<api.MatterPermission> o) {
+checkUnnamed1637(core.List<api.MatterPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMatterPermission(o[0]);
   checkMatterPermission(o[1]);
@@ -421,7 +416,7 @@
   if (buildCounterMatter < 3) {
     o.description = "foo";
     o.matterId = "foo";
-    o.matterPermissions = buildUnnamed1641();
+    o.matterPermissions = buildUnnamed1637();
     o.name = "foo";
     o.state = "foo";
   }
@@ -434,7 +429,7 @@
   if (buildCounterMatter < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.matterId, unittest.equals('foo'));
-    checkUnnamed1641(o.matterPermissions);
+    checkUnnamed1637(o.matterPermissions);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
   }
@@ -485,16 +480,14 @@
 buildReopenMatterRequest() {
   var o = new api.ReopenMatterRequest();
   buildCounterReopenMatterRequest++;
-  if (buildCounterReopenMatterRequest < 3) {
-  }
+  if (buildCounterReopenMatterRequest < 3) {}
   buildCounterReopenMatterRequest--;
   return o;
 }
 
 checkReopenMatterRequest(api.ReopenMatterRequest o) {
   buildCounterReopenMatterRequest++;
-  if (buildCounterReopenMatterRequest < 3) {
-  }
+  if (buildCounterReopenMatterRequest < 3) {}
   buildCounterReopenMatterRequest--;
 }
 
@@ -521,20 +514,17 @@
 buildUndeleteMatterRequest() {
   var o = new api.UndeleteMatterRequest();
   buildCounterUndeleteMatterRequest++;
-  if (buildCounterUndeleteMatterRequest < 3) {
-  }
+  if (buildCounterUndeleteMatterRequest < 3) {}
   buildCounterUndeleteMatterRequest--;
   return o;
 }
 
 checkUndeleteMatterRequest(api.UndeleteMatterRequest o) {
   buildCounterUndeleteMatterRequest++;
-  if (buildCounterUndeleteMatterRequest < 3) {
-  }
+  if (buildCounterUndeleteMatterRequest < 3) {}
   buildCounterUndeleteMatterRequest--;
 }
 
-
 main() {
   unittest.group("obj-schema-AddMatterPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
@@ -544,7 +534,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CloseMatterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildCloseMatterRequest();
@@ -553,7 +542,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CloseMatterResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCloseMatterResponse();
@@ -562,7 +550,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CorpusQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildCorpusQuery();
@@ -571,7 +558,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
       var o = buildEmpty();
@@ -580,7 +566,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HeldAccount", () {
     unittest.test("to-json--from-json", () {
       var o = buildHeldAccount();
@@ -589,7 +574,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HeldDriveQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildHeldDriveQuery();
@@ -598,7 +582,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HeldGroupsQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildHeldGroupsQuery();
@@ -607,7 +590,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HeldMailQuery", () {
     unittest.test("to-json--from-json", () {
       var o = buildHeldMailQuery();
@@ -616,7 +598,6 @@
     });
   });
 
-
   unittest.group("obj-schema-HeldOrgUnit", () {
     unittest.test("to-json--from-json", () {
       var o = buildHeldOrgUnit();
@@ -625,7 +606,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Hold", () {
     unittest.test("to-json--from-json", () {
       var o = buildHold();
@@ -634,7 +614,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListHeldAccountsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListHeldAccountsResponse();
@@ -643,7 +622,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListHoldsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListHoldsResponse();
@@ -652,7 +630,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListMattersResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListMattersResponse();
@@ -661,7 +638,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Matter", () {
     unittest.test("to-json--from-json", () {
       var o = buildMatter();
@@ -670,7 +646,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MatterPermission", () {
     unittest.test("to-json--from-json", () {
       var o = buildMatterPermission();
@@ -679,7 +654,6 @@
     });
   });
 
-
   unittest.group("obj-schema-RemoveMatterPermissionsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildRemoveMatterPermissionsRequest();
@@ -688,7 +662,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReopenMatterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildReopenMatterRequest();
@@ -697,7 +670,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReopenMatterResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildReopenMatterResponse();
@@ -706,7 +678,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UndeleteMatterRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildUndeleteMatterRequest();
@@ -715,10 +686,8 @@
     });
   });
 
-
   unittest.group("resource-MattersResourceApi", () {
     unittest.test("method--addPermissions", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildAddMatterPermissionsRequest();
@@ -731,16 +700,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf(":addPermissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals(":addPermissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals(":addPermissions"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -753,27 +726,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMatterPermission());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.addPermissions(arg_request, arg_matterId).then(unittest.expectAsync1(((api.MatterPermission response) {
+      res
+          .addPermissions(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.MatterPermission response) {
         checkMatterPermission(response);
       })));
     });
 
     unittest.test("method--close", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildCloseMatterRequest();
@@ -786,16 +761,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf(":close", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals(":close"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals(":close"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -808,27 +787,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCloseMatterResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.close(arg_request, arg_matterId).then(unittest.expectAsync1(((api.CloseMatterResponse response) {
+      res
+          .close(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.CloseMatterResponse response) {
         checkCloseMatterResponse(response);
       })));
     });
 
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildMatter();
@@ -840,9 +821,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("v1/matters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("v1/matters"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -855,27 +838,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMatter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync1(((api.Matter response) {
+      res
+          .create(arg_request)
+          .then(unittest.expectAsync1(((api.Matter response) {
         checkMatter(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_matterId = "foo";
@@ -884,9 +869,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -902,27 +889,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMatter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_matterId).then(unittest.expectAsync1(((api.Matter response) {
+      res
+          .delete(arg_matterId)
+          .then(unittest.expectAsync1(((api.Matter response) {
         checkMatter(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_matterId = "foo";
@@ -932,9 +921,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -950,28 +941,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMatter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_matterId, view: arg_view).then(unittest.expectAsync1(((api.Matter response) {
+      res
+          .get(arg_matterId, view: arg_view)
+          .then(unittest.expectAsync1(((api.Matter response) {
         checkMatter(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_pageToken = "foo";
@@ -982,9 +975,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("v1/matters"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("v1/matters"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -997,30 +992,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
         unittest.expect(queryMap["view"].first, unittest.equals(arg_view));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListMattersResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(pageToken: arg_pageToken, pageSize: arg_pageSize, view: arg_view).then(unittest.expectAsync1(((api.ListMattersResponse response) {
+      res
+          .list(
+              pageToken: arg_pageToken, pageSize: arg_pageSize, view: arg_view)
+          .then(unittest.expectAsync1(((api.ListMattersResponse response) {
         checkListMattersResponse(response);
       })));
     });
 
     unittest.test("method--removePermissions", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildRemoveMatterPermissionsRequest();
@@ -1033,16 +1033,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf(":removePermissions", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals(":removePermissions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals(":removePermissions"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -1055,27 +1059,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.removePermissions(arg_request, arg_matterId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .removePermissions(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--reopen", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildReopenMatterRequest();
@@ -1088,16 +1094,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf(":reopen", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":reopen"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals(":reopen"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -1110,27 +1120,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReopenMatterResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reopen(arg_request, arg_matterId).then(unittest.expectAsync1(((api.ReopenMatterResponse response) {
+      res
+          .reopen(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.ReopenMatterResponse response) {
         checkReopenMatterResponse(response);
       })));
     });
 
     unittest.test("method--undelete", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildUndeleteMatterRequest();
@@ -1143,16 +1155,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf(":undelete", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":undelete"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals(":undelete"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1165,27 +1181,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMatter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.undelete(arg_request, arg_matterId).then(unittest.expectAsync1(((api.Matter response) {
+      res
+          .undelete(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.Matter response) {
         checkMatter(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.MattersResourceApi res = new api.VaultApi(mock).matters;
       var arg_request = buildMatter();
@@ -1198,9 +1216,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1216,31 +1236,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMatter());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_matterId).then(unittest.expectAsync1(((api.Matter response) {
+      res
+          .update(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.Matter response) {
         checkMatter(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MattersHoldsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.MattersHoldsResourceApi res = new api.VaultApi(mock).matters.holds;
       var arg_request = buildHold();
@@ -1253,16 +1273,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/holds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/holds"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1275,27 +1299,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHold());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_matterId).then(unittest.expectAsync1(((api.Hold response) {
+      res
+          .create(arg_request, arg_matterId)
+          .then(unittest.expectAsync1(((api.Hold response) {
         checkHold(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.MattersHoldsResourceApi res = new api.VaultApi(mock).matters.holds;
       var arg_matterId = "foo";
@@ -1305,16 +1331,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/holds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/holds/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1330,27 +1360,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_matterId, arg_holdId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_matterId, arg_holdId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.MattersHoldsResourceApi res = new api.VaultApi(mock).matters.holds;
       var arg_matterId = "foo";
@@ -1360,16 +1392,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/holds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/holds/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1385,27 +1421,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHold());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_matterId, arg_holdId).then(unittest.expectAsync1(((api.Hold response) {
+      res
+          .get(arg_matterId, arg_holdId)
+          .then(unittest.expectAsync1(((api.Hold response) {
         checkHold(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.MattersHoldsResourceApi res = new api.VaultApi(mock).matters.holds;
       var arg_matterId = "foo";
@@ -1416,16 +1454,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/holds"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("/holds"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -1438,29 +1480,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListHoldsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_matterId, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListHoldsResponse response) {
+      res
+          .list(arg_matterId, pageToken: arg_pageToken, pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListHoldsResponse response) {
         checkListHoldsResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.MattersHoldsResourceApi res = new api.VaultApi(mock).matters.holds;
       var arg_request = buildHold();
@@ -1474,16 +1520,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/holds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/holds/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1499,33 +1549,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHold());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_matterId, arg_holdId).then(unittest.expectAsync1(((api.Hold response) {
+      res
+          .update(arg_request, arg_matterId, arg_holdId)
+          .then(unittest.expectAsync1(((api.Hold response) {
         checkHold(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MattersHoldsAccountsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
-      api.MattersHoldsAccountsResourceApi res = new api.VaultApi(mock).matters.holds.accounts;
+      api.MattersHoldsAccountsResourceApi res =
+          new api.VaultApi(mock).matters.holds.accounts;
       var arg_request = buildHeldAccount();
       var arg_matterId = "foo";
       var arg_holdId = "foo";
@@ -1537,23 +1588,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/holds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/holds/"));
         pathOffset += 7;
         index = path.indexOf("/accounts", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_holdId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/accounts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/accounts"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1566,29 +1623,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildHeldAccount());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, arg_matterId, arg_holdId).then(unittest.expectAsync1(((api.HeldAccount response) {
+      res
+          .create(arg_request, arg_matterId, arg_holdId)
+          .then(unittest.expectAsync1(((api.HeldAccount response) {
         checkHeldAccount(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.MattersHoldsAccountsResourceApi res = new api.VaultApi(mock).matters.holds.accounts;
+      api.MattersHoldsAccountsResourceApi res =
+          new api.VaultApi(mock).matters.holds.accounts;
       var arg_matterId = "foo";
       var arg_holdId = "foo";
       var arg_accountId = "foo";
@@ -1597,23 +1657,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/holds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/holds/"));
         pathOffset += 7;
         index = path.indexOf("/accounts/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_holdId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/accounts/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/accounts/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1629,29 +1695,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_matterId, arg_holdId, arg_accountId).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_matterId, arg_holdId, arg_accountId)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.MattersHoldsAccountsResourceApi res = new api.VaultApi(mock).matters.holds.accounts;
+      api.MattersHoldsAccountsResourceApi res =
+          new api.VaultApi(mock).matters.holds.accounts;
       var arg_matterId = "foo";
       var arg_holdId = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1659,23 +1728,29 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("v1/matters/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("v1/matters/"));
         pathOffset += 11;
         index = path.indexOf("/holds/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_matterId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/holds/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("/holds/"));
         pathOffset += 7;
         index = path.indexOf("/accounts", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_holdId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/accounts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/accounts"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -1688,27 +1763,26 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListHeldAccountsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_matterId, arg_holdId).then(unittest.expectAsync1(((api.ListHeldAccountsResponse response) {
+      res
+          .list(arg_matterId, arg_holdId)
+          .then(unittest.expectAsync1(((api.ListHeldAccountsResponse response) {
         checkListHeldAccountsResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/vision/v1_test.dart b/generated/googleapis/test/vision/v1_test.dart
index ca97e4d..f4e491b 100644
--- a/generated/googleapis/test/vision/v1_test.dart
+++ b/generated/googleapis/test/vision/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.vision.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/vision/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1306() {
+buildUnnamed1302() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed1306(core.List<api.Feature> o) {
+checkUnnamed1302(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -69,7 +68,7 @@
   var o = new api.AnnotateImageRequest();
   buildCounterAnnotateImageRequest++;
   if (buildCounterAnnotateImageRequest < 3) {
-    o.features = buildUnnamed1306();
+    o.features = buildUnnamed1302();
     o.image = buildImage();
     o.imageContext = buildImageContext();
   }
@@ -80,73 +79,73 @@
 checkAnnotateImageRequest(api.AnnotateImageRequest o) {
   buildCounterAnnotateImageRequest++;
   if (buildCounterAnnotateImageRequest < 3) {
-    checkUnnamed1306(o.features);
+    checkUnnamed1302(o.features);
     checkImage(o.image);
     checkImageContext(o.imageContext);
   }
   buildCounterAnnotateImageRequest--;
 }
 
-buildUnnamed1307() {
+buildUnnamed1303() {
   var o = new core.List<api.FaceAnnotation>();
   o.add(buildFaceAnnotation());
   o.add(buildFaceAnnotation());
   return o;
 }
 
-checkUnnamed1307(core.List<api.FaceAnnotation> o) {
+checkUnnamed1303(core.List<api.FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFaceAnnotation(o[0]);
   checkFaceAnnotation(o[1]);
 }
 
-buildUnnamed1308() {
+buildUnnamed1304() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1308(core.List<api.EntityAnnotation> o) {
+checkUnnamed1304(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
 }
 
-buildUnnamed1309() {
+buildUnnamed1305() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1309(core.List<api.EntityAnnotation> o) {
+checkUnnamed1305(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
 }
 
-buildUnnamed1310() {
+buildUnnamed1306() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1310(core.List<api.EntityAnnotation> o) {
+checkUnnamed1306(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
 }
 
-buildUnnamed1311() {
+buildUnnamed1307() {
   var o = new core.List<api.EntityAnnotation>();
   o.add(buildEntityAnnotation());
   o.add(buildEntityAnnotation());
   return o;
 }
 
-checkUnnamed1311(core.List<api.EntityAnnotation> o) {
+checkUnnamed1307(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAnnotation(o[0]);
   checkEntityAnnotation(o[1]);
@@ -159,14 +158,14 @@
   if (buildCounterAnnotateImageResponse < 3) {
     o.cropHintsAnnotation = buildCropHintsAnnotation();
     o.error = buildStatus();
-    o.faceAnnotations = buildUnnamed1307();
+    o.faceAnnotations = buildUnnamed1303();
     o.fullTextAnnotation = buildTextAnnotation();
     o.imagePropertiesAnnotation = buildImageProperties();
-    o.labelAnnotations = buildUnnamed1308();
-    o.landmarkAnnotations = buildUnnamed1309();
-    o.logoAnnotations = buildUnnamed1310();
+    o.labelAnnotations = buildUnnamed1304();
+    o.landmarkAnnotations = buildUnnamed1305();
+    o.logoAnnotations = buildUnnamed1306();
     o.safeSearchAnnotation = buildSafeSearchAnnotation();
-    o.textAnnotations = buildUnnamed1311();
+    o.textAnnotations = buildUnnamed1307();
     o.webDetection = buildWebDetection();
   }
   buildCounterAnnotateImageResponse--;
@@ -178,27 +177,27 @@
   if (buildCounterAnnotateImageResponse < 3) {
     checkCropHintsAnnotation(o.cropHintsAnnotation);
     checkStatus(o.error);
-    checkUnnamed1307(o.faceAnnotations);
+    checkUnnamed1303(o.faceAnnotations);
     checkTextAnnotation(o.fullTextAnnotation);
     checkImageProperties(o.imagePropertiesAnnotation);
-    checkUnnamed1308(o.labelAnnotations);
-    checkUnnamed1309(o.landmarkAnnotations);
-    checkUnnamed1310(o.logoAnnotations);
+    checkUnnamed1304(o.labelAnnotations);
+    checkUnnamed1305(o.landmarkAnnotations);
+    checkUnnamed1306(o.logoAnnotations);
     checkSafeSearchAnnotation(o.safeSearchAnnotation);
-    checkUnnamed1311(o.textAnnotations);
+    checkUnnamed1307(o.textAnnotations);
     checkWebDetection(o.webDetection);
   }
   buildCounterAnnotateImageResponse--;
 }
 
-buildUnnamed1312() {
+buildUnnamed1308() {
   var o = new core.List<api.AnnotateImageRequest>();
   o.add(buildAnnotateImageRequest());
   o.add(buildAnnotateImageRequest());
   return o;
 }
 
-checkUnnamed1312(core.List<api.AnnotateImageRequest> o) {
+checkUnnamed1308(core.List<api.AnnotateImageRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotateImageRequest(o[0]);
   checkAnnotateImageRequest(o[1]);
@@ -209,7 +208,7 @@
   var o = new api.BatchAnnotateImagesRequest();
   buildCounterBatchAnnotateImagesRequest++;
   if (buildCounterBatchAnnotateImagesRequest < 3) {
-    o.requests = buildUnnamed1312();
+    o.requests = buildUnnamed1308();
   }
   buildCounterBatchAnnotateImagesRequest--;
   return o;
@@ -218,19 +217,19 @@
 checkBatchAnnotateImagesRequest(api.BatchAnnotateImagesRequest o) {
   buildCounterBatchAnnotateImagesRequest++;
   if (buildCounterBatchAnnotateImagesRequest < 3) {
-    checkUnnamed1312(o.requests);
+    checkUnnamed1308(o.requests);
   }
   buildCounterBatchAnnotateImagesRequest--;
 }
 
-buildUnnamed1313() {
+buildUnnamed1309() {
   var o = new core.List<api.AnnotateImageResponse>();
   o.add(buildAnnotateImageResponse());
   o.add(buildAnnotateImageResponse());
   return o;
 }
 
-checkUnnamed1313(core.List<api.AnnotateImageResponse> o) {
+checkUnnamed1309(core.List<api.AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotateImageResponse(o[0]);
   checkAnnotateImageResponse(o[1]);
@@ -241,7 +240,7 @@
   var o = new api.BatchAnnotateImagesResponse();
   buildCounterBatchAnnotateImagesResponse++;
   if (buildCounterBatchAnnotateImagesResponse < 3) {
-    o.responses = buildUnnamed1313();
+    o.responses = buildUnnamed1309();
   }
   buildCounterBatchAnnotateImagesResponse--;
   return o;
@@ -250,19 +249,19 @@
 checkBatchAnnotateImagesResponse(api.BatchAnnotateImagesResponse o) {
   buildCounterBatchAnnotateImagesResponse++;
   if (buildCounterBatchAnnotateImagesResponse < 3) {
-    checkUnnamed1313(o.responses);
+    checkUnnamed1309(o.responses);
   }
   buildCounterBatchAnnotateImagesResponse--;
 }
 
-buildUnnamed1314() {
+buildUnnamed1310() {
   var o = new core.List<api.Paragraph>();
   o.add(buildParagraph());
   o.add(buildParagraph());
   return o;
 }
 
-checkUnnamed1314(core.List<api.Paragraph> o) {
+checkUnnamed1310(core.List<api.Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParagraph(o[0]);
   checkParagraph(o[1]);
@@ -275,7 +274,7 @@
   if (buildCounterBlock < 3) {
     o.blockType = "foo";
     o.boundingBox = buildBoundingPoly();
-    o.paragraphs = buildUnnamed1314();
+    o.paragraphs = buildUnnamed1310();
     o.property = buildTextProperty();
   }
   buildCounterBlock--;
@@ -287,20 +286,20 @@
   if (buildCounterBlock < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
     checkBoundingPoly(o.boundingBox);
-    checkUnnamed1314(o.paragraphs);
+    checkUnnamed1310(o.paragraphs);
     checkTextProperty(o.property);
   }
   buildCounterBlock--;
 }
 
-buildUnnamed1315() {
+buildUnnamed1311() {
   var o = new core.List<api.Vertex>();
   o.add(buildVertex());
   o.add(buildVertex());
   return o;
 }
 
-checkUnnamed1315(core.List<api.Vertex> o) {
+checkUnnamed1311(core.List<api.Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVertex(o[0]);
   checkVertex(o[1]);
@@ -311,7 +310,7 @@
   var o = new api.BoundingPoly();
   buildCounterBoundingPoly++;
   if (buildCounterBoundingPoly < 3) {
-    o.vertices = buildUnnamed1315();
+    o.vertices = buildUnnamed1311();
   }
   buildCounterBoundingPoly--;
   return o;
@@ -320,7 +319,7 @@
 checkBoundingPoly(api.BoundingPoly o) {
   buildCounterBoundingPoly++;
   if (buildCounterBoundingPoly < 3) {
-    checkUnnamed1315(o.vertices);
+    checkUnnamed1311(o.vertices);
   }
   buildCounterBoundingPoly--;
 }
@@ -396,14 +395,14 @@
   buildCounterCropHint--;
 }
 
-buildUnnamed1316() {
+buildUnnamed1312() {
   var o = new core.List<api.CropHint>();
   o.add(buildCropHint());
   o.add(buildCropHint());
   return o;
 }
 
-checkUnnamed1316(core.List<api.CropHint> o) {
+checkUnnamed1312(core.List<api.CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCropHint(o[0]);
   checkCropHint(o[1]);
@@ -414,7 +413,7 @@
   var o = new api.CropHintsAnnotation();
   buildCounterCropHintsAnnotation++;
   if (buildCounterCropHintsAnnotation < 3) {
-    o.cropHints = buildUnnamed1316();
+    o.cropHints = buildUnnamed1312();
   }
   buildCounterCropHintsAnnotation--;
   return o;
@@ -423,19 +422,19 @@
 checkCropHintsAnnotation(api.CropHintsAnnotation o) {
   buildCounterCropHintsAnnotation++;
   if (buildCounterCropHintsAnnotation < 3) {
-    checkUnnamed1316(o.cropHints);
+    checkUnnamed1312(o.cropHints);
   }
   buildCounterCropHintsAnnotation--;
 }
 
-buildUnnamed1317() {
+buildUnnamed1313() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1317(core.List<core.double> o) {
+checkUnnamed1313(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -446,7 +445,7 @@
   var o = new api.CropHintsParams();
   buildCounterCropHintsParams++;
   if (buildCounterCropHintsParams < 3) {
-    o.aspectRatios = buildUnnamed1317();
+    o.aspectRatios = buildUnnamed1313();
   }
   buildCounterCropHintsParams--;
   return o;
@@ -455,7 +454,7 @@
 checkCropHintsParams(api.CropHintsParams o) {
   buildCounterCropHintsParams++;
   if (buildCounterCropHintsParams < 3) {
-    checkUnnamed1317(o.aspectRatios);
+    checkUnnamed1313(o.aspectRatios);
   }
   buildCounterCropHintsParams--;
 }
@@ -502,14 +501,14 @@
   buildCounterDetectedLanguage--;
 }
 
-buildUnnamed1318() {
+buildUnnamed1314() {
   var o = new core.List<api.ColorInfo>();
   o.add(buildColorInfo());
   o.add(buildColorInfo());
   return o;
 }
 
-checkUnnamed1318(core.List<api.ColorInfo> o) {
+checkUnnamed1314(core.List<api.ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorInfo(o[0]);
   checkColorInfo(o[1]);
@@ -520,7 +519,7 @@
   var o = new api.DominantColorsAnnotation();
   buildCounterDominantColorsAnnotation++;
   if (buildCounterDominantColorsAnnotation < 3) {
-    o.colors = buildUnnamed1318();
+    o.colors = buildUnnamed1314();
   }
   buildCounterDominantColorsAnnotation--;
   return o;
@@ -529,32 +528,32 @@
 checkDominantColorsAnnotation(api.DominantColorsAnnotation o) {
   buildCounterDominantColorsAnnotation++;
   if (buildCounterDominantColorsAnnotation < 3) {
-    checkUnnamed1318(o.colors);
+    checkUnnamed1314(o.colors);
   }
   buildCounterDominantColorsAnnotation--;
 }
 
-buildUnnamed1319() {
+buildUnnamed1315() {
   var o = new core.List<api.LocationInfo>();
   o.add(buildLocationInfo());
   o.add(buildLocationInfo());
   return o;
 }
 
-checkUnnamed1319(core.List<api.LocationInfo> o) {
+checkUnnamed1315(core.List<api.LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationInfo(o[0]);
   checkLocationInfo(o[1]);
 }
 
-buildUnnamed1320() {
+buildUnnamed1316() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed1320(core.List<api.Property> o) {
+checkUnnamed1316(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -569,9 +568,9 @@
     o.confidence = 42.0;
     o.description = "foo";
     o.locale = "foo";
-    o.locations = buildUnnamed1319();
+    o.locations = buildUnnamed1315();
     o.mid = "foo";
-    o.properties = buildUnnamed1320();
+    o.properties = buildUnnamed1316();
     o.score = 42.0;
     o.topicality = 42.0;
   }
@@ -586,23 +585,23 @@
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1319(o.locations);
+    checkUnnamed1315(o.locations);
     unittest.expect(o.mid, unittest.equals('foo'));
-    checkUnnamed1320(o.properties);
+    checkUnnamed1316(o.properties);
     unittest.expect(o.score, unittest.equals(42.0));
     unittest.expect(o.topicality, unittest.equals(42.0));
   }
   buildCounterEntityAnnotation--;
 }
 
-buildUnnamed1321() {
+buildUnnamed1317() {
   var o = new core.List<api.Landmark>();
   o.add(buildLandmark());
   o.add(buildLandmark());
   return o;
 }
 
-checkUnnamed1321(core.List<api.Landmark> o) {
+checkUnnamed1317(core.List<api.Landmark> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLandmark(o[0]);
   checkLandmark(o[1]);
@@ -621,7 +620,7 @@
     o.headwearLikelihood = "foo";
     o.joyLikelihood = "foo";
     o.landmarkingConfidence = 42.0;
-    o.landmarks = buildUnnamed1321();
+    o.landmarks = buildUnnamed1317();
     o.panAngle = 42.0;
     o.rollAngle = 42.0;
     o.sorrowLikelihood = "foo";
@@ -644,7 +643,7 @@
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
-    checkUnnamed1321(o.landmarks);
+    checkUnnamed1317(o.landmarks);
     unittest.expect(o.panAngle, unittest.equals(42.0));
     unittest.expect(o.rollAngle, unittest.equals(42.0));
     unittest.expect(o.sorrowLikelihood, unittest.equals('foo'));
@@ -697,14 +696,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed1322() {
+buildUnnamed1318() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1322(core.List<core.String> o) {
+checkUnnamed1318(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -716,7 +715,7 @@
   buildCounterImageContext++;
   if (buildCounterImageContext < 3) {
     o.cropHintsParams = buildCropHintsParams();
-    o.languageHints = buildUnnamed1322();
+    o.languageHints = buildUnnamed1318();
     o.latLongRect = buildLatLongRect();
   }
   buildCounterImageContext--;
@@ -727,7 +726,7 @@
   buildCounterImageContext++;
   if (buildCounterImageContext < 3) {
     checkCropHintsParams(o.cropHintsParams);
-    checkUnnamed1322(o.languageHints);
+    checkUnnamed1318(o.languageHints);
     checkLatLongRect(o.latLongRect);
   }
   buildCounterImageContext--;
@@ -855,14 +854,14 @@
   buildCounterLocationInfo--;
 }
 
-buildUnnamed1323() {
+buildUnnamed1319() {
   var o = new core.List<api.Block>();
   o.add(buildBlock());
   o.add(buildBlock());
   return o;
 }
 
-checkUnnamed1323(core.List<api.Block> o) {
+checkUnnamed1319(core.List<api.Block> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlock(o[0]);
   checkBlock(o[1]);
@@ -873,7 +872,7 @@
   var o = new api.Page();
   buildCounterPage++;
   if (buildCounterPage < 3) {
-    o.blocks = buildUnnamed1323();
+    o.blocks = buildUnnamed1319();
     o.height = 42;
     o.property = buildTextProperty();
     o.width = 42;
@@ -885,7 +884,7 @@
 checkPage(api.Page o) {
   buildCounterPage++;
   if (buildCounterPage < 3) {
-    checkUnnamed1323(o.blocks);
+    checkUnnamed1319(o.blocks);
     unittest.expect(o.height, unittest.equals(42));
     checkTextProperty(o.property);
     unittest.expect(o.width, unittest.equals(42));
@@ -893,14 +892,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed1324() {
+buildUnnamed1320() {
   var o = new core.List<api.Word>();
   o.add(buildWord());
   o.add(buildWord());
   return o;
 }
 
-checkUnnamed1324(core.List<api.Word> o) {
+checkUnnamed1320(core.List<api.Word> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWord(o[0]);
   checkWord(o[1]);
@@ -913,7 +912,7 @@
   if (buildCounterParagraph < 3) {
     o.boundingBox = buildBoundingPoly();
     o.property = buildTextProperty();
-    o.words = buildUnnamed1324();
+    o.words = buildUnnamed1320();
   }
   buildCounterParagraph--;
   return o;
@@ -924,7 +923,7 @@
   if (buildCounterParagraph < 3) {
     checkBoundingPoly(o.boundingBox);
     checkTextProperty(o.property);
-    checkUnnamed1324(o.words);
+    checkUnnamed1320(o.words);
   }
   buildCounterParagraph--;
 }
@@ -1000,30 +999,46 @@
   buildCounterSafeSearchAnnotation--;
 }
 
-buildUnnamed1325() {
+buildUnnamed1321() {
   var o = new core.Map<core.String, core.Object>();
-  o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
-  o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["x"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
+  o["y"] = {
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  };
   return o;
 }
 
-checkUnnamed1325(core.Map<core.String, core.Object> o) {
+checkUnnamed1321(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o["x"]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o["y"]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed1326() {
+buildUnnamed1322() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed1325());
-  o.add(buildUnnamed1325());
+  o.add(buildUnnamed1321());
+  o.add(buildUnnamed1321());
   return o;
 }
 
-checkUnnamed1326(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed1322(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1325(o[0]);
-  checkUnnamed1325(o[1]);
+  checkUnnamed1321(o[0]);
+  checkUnnamed1321(o[1]);
 }
 
 core.int buildCounterStatus = 0;
@@ -1032,7 +1047,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed1326();
+    o.details = buildUnnamed1322();
     o.message = "foo";
   }
   buildCounterStatus--;
@@ -1043,7 +1058,7 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed1326(o.details);
+    checkUnnamed1322(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterStatus--;
@@ -1072,14 +1087,14 @@
   buildCounterSymbol--;
 }
 
-buildUnnamed1327() {
+buildUnnamed1323() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed1327(core.List<api.Page> o) {
+checkUnnamed1323(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -1090,7 +1105,7 @@
   var o = new api.TextAnnotation();
   buildCounterTextAnnotation++;
   if (buildCounterTextAnnotation < 3) {
-    o.pages = buildUnnamed1327();
+    o.pages = buildUnnamed1323();
     o.text = "foo";
   }
   buildCounterTextAnnotation--;
@@ -1100,20 +1115,20 @@
 checkTextAnnotation(api.TextAnnotation o) {
   buildCounterTextAnnotation++;
   if (buildCounterTextAnnotation < 3) {
-    checkUnnamed1327(o.pages);
+    checkUnnamed1323(o.pages);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterTextAnnotation--;
 }
 
-buildUnnamed1328() {
+buildUnnamed1324() {
   var o = new core.List<api.DetectedLanguage>();
   o.add(buildDetectedLanguage());
   o.add(buildDetectedLanguage());
   return o;
 }
 
-checkUnnamed1328(core.List<api.DetectedLanguage> o) {
+checkUnnamed1324(core.List<api.DetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectedLanguage(o[0]);
   checkDetectedLanguage(o[1]);
@@ -1125,7 +1140,7 @@
   buildCounterTextProperty++;
   if (buildCounterTextProperty < 3) {
     o.detectedBreak = buildDetectedBreak();
-    o.detectedLanguages = buildUnnamed1328();
+    o.detectedLanguages = buildUnnamed1324();
   }
   buildCounterTextProperty--;
   return o;
@@ -1135,7 +1150,7 @@
   buildCounterTextProperty++;
   if (buildCounterTextProperty < 3) {
     checkDetectedBreak(o.detectedBreak);
-    checkUnnamed1328(o.detectedLanguages);
+    checkUnnamed1324(o.detectedLanguages);
   }
   buildCounterTextProperty--;
 }
@@ -1161,66 +1176,66 @@
   buildCounterVertex--;
 }
 
-buildUnnamed1329() {
+buildUnnamed1325() {
   var o = new core.List<api.WebImage>();
   o.add(buildWebImage());
   o.add(buildWebImage());
   return o;
 }
 
-checkUnnamed1329(core.List<api.WebImage> o) {
+checkUnnamed1325(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebImage(o[0]);
   checkWebImage(o[1]);
 }
 
-buildUnnamed1330() {
+buildUnnamed1326() {
   var o = new core.List<api.WebPage>();
   o.add(buildWebPage());
   o.add(buildWebPage());
   return o;
 }
 
-checkUnnamed1330(core.List<api.WebPage> o) {
+checkUnnamed1326(core.List<api.WebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPage(o[0]);
   checkWebPage(o[1]);
 }
 
-buildUnnamed1331() {
+buildUnnamed1327() {
   var o = new core.List<api.WebImage>();
   o.add(buildWebImage());
   o.add(buildWebImage());
   return o;
 }
 
-checkUnnamed1331(core.List<api.WebImage> o) {
+checkUnnamed1327(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebImage(o[0]);
   checkWebImage(o[1]);
 }
 
-buildUnnamed1332() {
+buildUnnamed1328() {
   var o = new core.List<api.WebImage>();
   o.add(buildWebImage());
   o.add(buildWebImage());
   return o;
 }
 
-checkUnnamed1332(core.List<api.WebImage> o) {
+checkUnnamed1328(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebImage(o[0]);
   checkWebImage(o[1]);
 }
 
-buildUnnamed1333() {
+buildUnnamed1329() {
   var o = new core.List<api.WebEntity>();
   o.add(buildWebEntity());
   o.add(buildWebEntity());
   return o;
 }
 
-checkUnnamed1333(core.List<api.WebEntity> o) {
+checkUnnamed1329(core.List<api.WebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebEntity(o[0]);
   checkWebEntity(o[1]);
@@ -1231,11 +1246,11 @@
   var o = new api.WebDetection();
   buildCounterWebDetection++;
   if (buildCounterWebDetection < 3) {
-    o.fullMatchingImages = buildUnnamed1329();
-    o.pagesWithMatchingImages = buildUnnamed1330();
-    o.partialMatchingImages = buildUnnamed1331();
-    o.visuallySimilarImages = buildUnnamed1332();
-    o.webEntities = buildUnnamed1333();
+    o.fullMatchingImages = buildUnnamed1325();
+    o.pagesWithMatchingImages = buildUnnamed1326();
+    o.partialMatchingImages = buildUnnamed1327();
+    o.visuallySimilarImages = buildUnnamed1328();
+    o.webEntities = buildUnnamed1329();
   }
   buildCounterWebDetection--;
   return o;
@@ -1244,11 +1259,11 @@
 checkWebDetection(api.WebDetection o) {
   buildCounterWebDetection++;
   if (buildCounterWebDetection < 3) {
-    checkUnnamed1329(o.fullMatchingImages);
-    checkUnnamed1330(o.pagesWithMatchingImages);
-    checkUnnamed1331(o.partialMatchingImages);
-    checkUnnamed1332(o.visuallySimilarImages);
-    checkUnnamed1333(o.webEntities);
+    checkUnnamed1325(o.fullMatchingImages);
+    checkUnnamed1326(o.pagesWithMatchingImages);
+    checkUnnamed1327(o.partialMatchingImages);
+    checkUnnamed1328(o.visuallySimilarImages);
+    checkUnnamed1329(o.webEntities);
   }
   buildCounterWebDetection--;
 }
@@ -1318,14 +1333,14 @@
   buildCounterWebPage--;
 }
 
-buildUnnamed1334() {
+buildUnnamed1330() {
   var o = new core.List<api.Symbol>();
   o.add(buildSymbol());
   o.add(buildSymbol());
   return o;
 }
 
-checkUnnamed1334(core.List<api.Symbol> o) {
+checkUnnamed1330(core.List<api.Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSymbol(o[0]);
   checkSymbol(o[1]);
@@ -1338,7 +1353,7 @@
   if (buildCounterWord < 3) {
     o.boundingBox = buildBoundingPoly();
     o.property = buildTextProperty();
-    o.symbols = buildUnnamed1334();
+    o.symbols = buildUnnamed1330();
   }
   buildCounterWord--;
   return o;
@@ -1349,12 +1364,11 @@
   if (buildCounterWord < 3) {
     checkBoundingPoly(o.boundingBox);
     checkTextProperty(o.property);
-    checkUnnamed1334(o.symbols);
+    checkUnnamed1330(o.symbols);
   }
   buildCounterWord--;
 }
 
-
 main() {
   unittest.group("obj-schema-AnnotateImageRequest", () {
     unittest.test("to-json--from-json", () {
@@ -1364,7 +1378,6 @@
     });
   });
 
-
   unittest.group("obj-schema-AnnotateImageResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildAnnotateImageResponse();
@@ -1373,7 +1386,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchAnnotateImagesRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchAnnotateImagesRequest();
@@ -1382,7 +1394,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BatchAnnotateImagesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchAnnotateImagesResponse();
@@ -1391,7 +1402,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Block", () {
     unittest.test("to-json--from-json", () {
       var o = buildBlock();
@@ -1400,7 +1410,6 @@
     });
   });
 
-
   unittest.group("obj-schema-BoundingPoly", () {
     unittest.test("to-json--from-json", () {
       var o = buildBoundingPoly();
@@ -1409,7 +1418,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Color", () {
     unittest.test("to-json--from-json", () {
       var o = buildColor();
@@ -1418,7 +1426,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ColorInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildColorInfo();
@@ -1427,7 +1434,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CropHint", () {
     unittest.test("to-json--from-json", () {
       var o = buildCropHint();
@@ -1436,7 +1442,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CropHintsAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildCropHintsAnnotation();
@@ -1445,7 +1450,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CropHintsParams", () {
     unittest.test("to-json--from-json", () {
       var o = buildCropHintsParams();
@@ -1454,7 +1458,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DetectedBreak", () {
     unittest.test("to-json--from-json", () {
       var o = buildDetectedBreak();
@@ -1463,7 +1466,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DetectedLanguage", () {
     unittest.test("to-json--from-json", () {
       var o = buildDetectedLanguage();
@@ -1472,7 +1474,6 @@
     });
   });
 
-
   unittest.group("obj-schema-DominantColorsAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildDominantColorsAnnotation();
@@ -1481,7 +1482,6 @@
     });
   });
 
-
   unittest.group("obj-schema-EntityAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildEntityAnnotation();
@@ -1490,7 +1490,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FaceAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildFaceAnnotation();
@@ -1499,7 +1498,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Feature", () {
     unittest.test("to-json--from-json", () {
       var o = buildFeature();
@@ -1508,7 +1506,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Image", () {
     unittest.test("to-json--from-json", () {
       var o = buildImage();
@@ -1517,7 +1514,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageContext", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageContext();
@@ -1526,7 +1522,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageProperties", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageProperties();
@@ -1535,7 +1530,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageSource", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageSource();
@@ -1544,7 +1538,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Landmark", () {
     unittest.test("to-json--from-json", () {
       var o = buildLandmark();
@@ -1553,7 +1546,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LatLng", () {
     unittest.test("to-json--from-json", () {
       var o = buildLatLng();
@@ -1562,7 +1554,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LatLongRect", () {
     unittest.test("to-json--from-json", () {
       var o = buildLatLongRect();
@@ -1571,7 +1562,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocationInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocationInfo();
@@ -1580,7 +1570,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Page", () {
     unittest.test("to-json--from-json", () {
       var o = buildPage();
@@ -1589,7 +1578,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Paragraph", () {
     unittest.test("to-json--from-json", () {
       var o = buildParagraph();
@@ -1598,7 +1586,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Position", () {
     unittest.test("to-json--from-json", () {
       var o = buildPosition();
@@ -1607,7 +1594,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Property", () {
     unittest.test("to-json--from-json", () {
       var o = buildProperty();
@@ -1616,7 +1602,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SafeSearchAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildSafeSearchAnnotation();
@@ -1625,7 +1610,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Status", () {
     unittest.test("to-json--from-json", () {
       var o = buildStatus();
@@ -1634,7 +1618,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Symbol", () {
     unittest.test("to-json--from-json", () {
       var o = buildSymbol();
@@ -1643,7 +1626,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextAnnotation", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextAnnotation();
@@ -1652,7 +1634,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TextProperty", () {
     unittest.test("to-json--from-json", () {
       var o = buildTextProperty();
@@ -1661,7 +1642,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Vertex", () {
     unittest.test("to-json--from-json", () {
       var o = buildVertex();
@@ -1670,7 +1650,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebDetection", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebDetection();
@@ -1679,7 +1658,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebEntity", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebEntity();
@@ -1688,7 +1666,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebImage", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebImage();
@@ -1697,7 +1674,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebPage", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebPage();
@@ -1706,7 +1682,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Word", () {
     unittest.test("to-json--from-json", () {
       var o = buildWord();
@@ -1715,10 +1690,8 @@
     });
   });
 
-
   unittest.group("resource-ImagesResourceApi", () {
     unittest.test("method--annotate", () {
-
       var mock = new HttpServerMock();
       api.ImagesResourceApi res = new api.VisionApi(mock).images;
       var arg_request = buildBatchAnnotateImagesRequest();
@@ -1730,9 +1703,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("v1/images:annotate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("v1/images:annotate"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -1745,27 +1720,25 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildBatchAnnotateImagesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.annotate(arg_request).then(unittest.expectAsync1(((api.BatchAnnotateImagesResponse response) {
+      res.annotate(arg_request).then(
+          unittest.expectAsync1(((api.BatchAnnotateImagesResponse response) {
         checkBatchAnnotateImagesResponse(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 693aed8..2fcc712 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.webfonts.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/webfonts/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,46 +44,46 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed1690() {
+buildUnnamed1686() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1690(core.Map<core.String, core.String> o) {
+checkUnnamed1686(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1691() {
+buildUnnamed1687() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1691(core.List<core.String> o) {
+checkUnnamed1687(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1692() {
+buildUnnamed1688() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1692(core.List<core.String> o) {
+checkUnnamed1688(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -97,11 +96,11 @@
   if (buildCounterWebfont < 3) {
     o.category = "foo";
     o.family = "foo";
-    o.files = buildUnnamed1690();
+    o.files = buildUnnamed1686();
     o.kind = "foo";
     o.lastModified = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.subsets = buildUnnamed1691();
-    o.variants = buildUnnamed1692();
+    o.subsets = buildUnnamed1687();
+    o.variants = buildUnnamed1688();
     o.version = "foo";
   }
   buildCounterWebfont--;
@@ -113,24 +112,25 @@
   if (buildCounterWebfont < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed1690(o.files);
+    checkUnnamed1686(o.files);
     unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.lastModified, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed1691(o.subsets);
-    checkUnnamed1692(o.variants);
+    unittest.expect(o.lastModified,
+        unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
+    checkUnnamed1687(o.subsets);
+    checkUnnamed1688(o.variants);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterWebfont--;
 }
 
-buildUnnamed1693() {
+buildUnnamed1689() {
   var o = new core.List<api.Webfont>();
   o.add(buildWebfont());
   o.add(buildWebfont());
   return o;
 }
 
-checkUnnamed1693(core.List<api.Webfont> o) {
+checkUnnamed1689(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebfont(o[0]);
   checkWebfont(o[1]);
@@ -141,7 +141,7 @@
   var o = new api.WebfontList();
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    o.items = buildUnnamed1693();
+    o.items = buildUnnamed1689();
     o.kind = "foo";
   }
   buildCounterWebfontList--;
@@ -151,13 +151,12 @@
 checkWebfontList(api.WebfontList o) {
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    checkUnnamed1693(o.items);
+    checkUnnamed1689(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWebfontList--;
 }
 
-
 main() {
   unittest.group("obj-schema-Webfont", () {
     unittest.test("to-json--from-json", () {
@@ -167,7 +166,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WebfontList", () {
     unittest.test("to-json--from-json", () {
       var o = buildWebfontList();
@@ -176,10 +174,8 @@
     });
   });
 
-
   unittest.group("resource-WebfontsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.WebfontsResourceApi res = new api.WebfontsApi(mock).webfonts;
       var arg_sort = "foo";
@@ -188,11 +184,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webfonts/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12),
+            unittest.equals("webfonts/v1/"));
         pathOffset += 12;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("webfonts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("webfonts"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -205,28 +204,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["sort"].first, unittest.equals(arg_sort));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWebfontList());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(sort: arg_sort).then(unittest.expectAsync1(((api.WebfontList response) {
+      res
+          .list(sort: arg_sort)
+          .then(unittest.expectAsync1(((api.WebfontList response) {
         checkWebfontList(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index 6bd5013..02a7468 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -1,12 +1,10 @@
 library googleapis.webmasters.v3.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/webmasters/v3.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed678() {
+buildUnnamed677() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed678(core.List<core.String> o) {
+checkUnnamed677(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -72,7 +71,7 @@
     o.clicks = 42.0;
     o.ctr = 42.0;
     o.impressions = 42.0;
-    o.keys = buildUnnamed678();
+    o.keys = buildUnnamed677();
     o.position = 42.0;
   }
   buildCounterApiDataRow--;
@@ -85,7 +84,7 @@
     unittest.expect(o.clicks, unittest.equals(42.0));
     unittest.expect(o.ctr, unittest.equals(42.0));
     unittest.expect(o.impressions, unittest.equals(42.0));
-    checkUnnamed678(o.keys);
+    checkUnnamed677(o.keys);
     unittest.expect(o.position, unittest.equals(42.0));
   }
   buildCounterApiDataRow--;
@@ -114,14 +113,14 @@
   buildCounterApiDimensionFilter--;
 }
 
-buildUnnamed679() {
+buildUnnamed678() {
   var o = new core.List<api.ApiDimensionFilter>();
   o.add(buildApiDimensionFilter());
   o.add(buildApiDimensionFilter());
   return o;
 }
 
-checkUnnamed679(core.List<api.ApiDimensionFilter> o) {
+checkUnnamed678(core.List<api.ApiDimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApiDimensionFilter(o[0]);
   checkApiDimensionFilter(o[1]);
@@ -132,7 +131,7 @@
   var o = new api.ApiDimensionFilterGroup();
   buildCounterApiDimensionFilterGroup++;
   if (buildCounterApiDimensionFilterGroup < 3) {
-    o.filters = buildUnnamed679();
+    o.filters = buildUnnamed678();
     o.groupType = "foo";
   }
   buildCounterApiDimensionFilterGroup--;
@@ -142,33 +141,33 @@
 checkApiDimensionFilterGroup(api.ApiDimensionFilterGroup o) {
   buildCounterApiDimensionFilterGroup++;
   if (buildCounterApiDimensionFilterGroup < 3) {
-    checkUnnamed679(o.filters);
+    checkUnnamed678(o.filters);
     unittest.expect(o.groupType, unittest.equals('foo'));
   }
   buildCounterApiDimensionFilterGroup--;
 }
 
-buildUnnamed680() {
+buildUnnamed679() {
   var o = new core.List<api.ApiDimensionFilterGroup>();
   o.add(buildApiDimensionFilterGroup());
   o.add(buildApiDimensionFilterGroup());
   return o;
 }
 
-checkUnnamed680(core.List<api.ApiDimensionFilterGroup> o) {
+checkUnnamed679(core.List<api.ApiDimensionFilterGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApiDimensionFilterGroup(o[0]);
   checkApiDimensionFilterGroup(o[1]);
 }
 
-buildUnnamed681() {
+buildUnnamed680() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed681(core.List<core.String> o) {
+checkUnnamed680(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -180,8 +179,8 @@
   buildCounterSearchAnalyticsQueryRequest++;
   if (buildCounterSearchAnalyticsQueryRequest < 3) {
     o.aggregationType = "foo";
-    o.dimensionFilterGroups = buildUnnamed680();
-    o.dimensions = buildUnnamed681();
+    o.dimensionFilterGroups = buildUnnamed679();
+    o.dimensions = buildUnnamed680();
     o.endDate = "foo";
     o.rowLimit = 42;
     o.searchType = "foo";
@@ -196,8 +195,8 @@
   buildCounterSearchAnalyticsQueryRequest++;
   if (buildCounterSearchAnalyticsQueryRequest < 3) {
     unittest.expect(o.aggregationType, unittest.equals('foo'));
-    checkUnnamed680(o.dimensionFilterGroups);
-    checkUnnamed681(o.dimensions);
+    checkUnnamed679(o.dimensionFilterGroups);
+    checkUnnamed680(o.dimensions);
     unittest.expect(o.endDate, unittest.equals('foo'));
     unittest.expect(o.rowLimit, unittest.equals(42));
     unittest.expect(o.searchType, unittest.equals('foo'));
@@ -207,14 +206,14 @@
   buildCounterSearchAnalyticsQueryRequest--;
 }
 
-buildUnnamed682() {
+buildUnnamed681() {
   var o = new core.List<api.ApiDataRow>();
   o.add(buildApiDataRow());
   o.add(buildApiDataRow());
   return o;
 }
 
-checkUnnamed682(core.List<api.ApiDataRow> o) {
+checkUnnamed681(core.List<api.ApiDataRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApiDataRow(o[0]);
   checkApiDataRow(o[1]);
@@ -226,7 +225,7 @@
   buildCounterSearchAnalyticsQueryResponse++;
   if (buildCounterSearchAnalyticsQueryResponse < 3) {
     o.responseAggregationType = "foo";
-    o.rows = buildUnnamed682();
+    o.rows = buildUnnamed681();
   }
   buildCounterSearchAnalyticsQueryResponse--;
   return o;
@@ -236,19 +235,19 @@
   buildCounterSearchAnalyticsQueryResponse++;
   if (buildCounterSearchAnalyticsQueryResponse < 3) {
     unittest.expect(o.responseAggregationType, unittest.equals('foo'));
-    checkUnnamed682(o.rows);
+    checkUnnamed681(o.rows);
   }
   buildCounterSearchAnalyticsQueryResponse--;
 }
 
-buildUnnamed683() {
+buildUnnamed682() {
   var o = new core.List<api.WmxSitemap>();
   o.add(buildWmxSitemap());
   o.add(buildWmxSitemap());
   return o;
 }
 
-checkUnnamed683(core.List<api.WmxSitemap> o) {
+checkUnnamed682(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemap(o[0]);
   checkWmxSitemap(o[1]);
@@ -259,7 +258,7 @@
   var o = new api.SitemapsListResponse();
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    o.sitemap = buildUnnamed683();
+    o.sitemap = buildUnnamed682();
   }
   buildCounterSitemapsListResponse--;
   return o;
@@ -268,19 +267,19 @@
 checkSitemapsListResponse(api.SitemapsListResponse o) {
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    checkUnnamed683(o.sitemap);
+    checkUnnamed682(o.sitemap);
   }
   buildCounterSitemapsListResponse--;
 }
 
-buildUnnamed684() {
+buildUnnamed683() {
   var o = new core.List<api.WmxSite>();
   o.add(buildWmxSite());
   o.add(buildWmxSite());
   return o;
 }
 
-checkUnnamed684(core.List<api.WmxSite> o) {
+checkUnnamed683(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSite(o[0]);
   checkWmxSite(o[1]);
@@ -291,7 +290,7 @@
   var o = new api.SitesListResponse();
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    o.siteEntry = buildUnnamed684();
+    o.siteEntry = buildUnnamed683();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -300,7 +299,7 @@
 checkSitesListResponse(api.SitesListResponse o) {
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    checkUnnamed684(o.siteEntry);
+    checkUnnamed683(o.siteEntry);
   }
   buildCounterSitesListResponse--;
 }
@@ -321,19 +320,20 @@
   buildCounterUrlCrawlErrorCount++;
   if (buildCounterUrlCrawlErrorCount < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    unittest.expect(o.timestamp, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.timestamp,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterUrlCrawlErrorCount--;
 }
 
-buildUnnamed685() {
+buildUnnamed684() {
   var o = new core.List<api.UrlCrawlErrorCount>();
   o.add(buildUrlCrawlErrorCount());
   o.add(buildUrlCrawlErrorCount());
   return o;
 }
 
-checkUnnamed685(core.List<api.UrlCrawlErrorCount> o) {
+checkUnnamed684(core.List<api.UrlCrawlErrorCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCount(o[0]);
   checkUrlCrawlErrorCount(o[1]);
@@ -345,7 +345,7 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     o.category = "foo";
-    o.entries = buildUnnamed685();
+    o.entries = buildUnnamed684();
     o.platform = "foo";
   }
   buildCounterUrlCrawlErrorCountsPerType--;
@@ -356,20 +356,20 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkUnnamed685(o.entries);
+    checkUnnamed684(o.entries);
     unittest.expect(o.platform, unittest.equals('foo'));
   }
   buildCounterUrlCrawlErrorCountsPerType--;
 }
 
-buildUnnamed686() {
+buildUnnamed685() {
   var o = new core.List<api.UrlCrawlErrorCountsPerType>();
   o.add(buildUrlCrawlErrorCountsPerType());
   o.add(buildUrlCrawlErrorCountsPerType());
   return o;
 }
 
-checkUnnamed686(core.List<api.UrlCrawlErrorCountsPerType> o) {
+checkUnnamed685(core.List<api.UrlCrawlErrorCountsPerType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCountsPerType(o[0]);
   checkUrlCrawlErrorCountsPerType(o[1]);
@@ -380,16 +380,17 @@
   var o = new api.UrlCrawlErrorsCountsQueryResponse();
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    o.countPerTypes = buildUnnamed686();
+    o.countPerTypes = buildUnnamed685();
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
   return o;
 }
 
-checkUrlCrawlErrorsCountsQueryResponse(api.UrlCrawlErrorsCountsQueryResponse o) {
+checkUrlCrawlErrorsCountsQueryResponse(
+    api.UrlCrawlErrorsCountsQueryResponse o) {
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    checkUnnamed686(o.countPerTypes);
+    checkUnnamed685(o.countPerTypes);
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
 }
@@ -412,8 +413,10 @@
 checkUrlCrawlErrorsSample(api.UrlCrawlErrorsSample o) {
   buildCounterUrlCrawlErrorsSample++;
   if (buildCounterUrlCrawlErrorsSample < 3) {
-    unittest.expect(o.firstDetected, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.lastCrawled, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.firstDetected,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastCrawled,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.pageUrl, unittest.equals('foo'));
     unittest.expect(o.responseCode, unittest.equals(42));
     checkUrlSampleDetails(o.urlDetails);
@@ -421,14 +424,14 @@
   buildCounterUrlCrawlErrorsSample--;
 }
 
-buildUnnamed687() {
+buildUnnamed686() {
   var o = new core.List<api.UrlCrawlErrorsSample>();
   o.add(buildUrlCrawlErrorsSample());
   o.add(buildUrlCrawlErrorsSample());
   return o;
 }
 
-checkUnnamed687(core.List<api.UrlCrawlErrorsSample> o) {
+checkUnnamed686(core.List<api.UrlCrawlErrorsSample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorsSample(o[0]);
   checkUrlCrawlErrorsSample(o[1]);
@@ -439,20 +442,34 @@
   var o = new api.UrlCrawlErrorsSamplesListResponse();
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    o.urlCrawlErrorSample = buildUnnamed687();
+    o.urlCrawlErrorSample = buildUnnamed686();
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
   return o;
 }
 
-checkUrlCrawlErrorsSamplesListResponse(api.UrlCrawlErrorsSamplesListResponse o) {
+checkUrlCrawlErrorsSamplesListResponse(
+    api.UrlCrawlErrorsSamplesListResponse o) {
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    checkUnnamed687(o.urlCrawlErrorSample);
+    checkUnnamed686(o.urlCrawlErrorSample);
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
 }
 
+buildUnnamed687() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed687(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed688() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -466,26 +483,13 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed689() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed689(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterUrlSampleDetails = 0;
 buildUrlSampleDetails() {
   var o = new api.UrlSampleDetails();
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    o.containingSitemaps = buildUnnamed688();
-    o.linkedFromUrls = buildUnnamed689();
+    o.containingSitemaps = buildUnnamed687();
+    o.linkedFromUrls = buildUnnamed688();
   }
   buildCounterUrlSampleDetails--;
   return o;
@@ -494,8 +498,8 @@
 checkUrlSampleDetails(api.UrlSampleDetails o) {
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    checkUnnamed688(o.containingSitemaps);
-    checkUnnamed689(o.linkedFromUrls);
+    checkUnnamed687(o.containingSitemaps);
+    checkUnnamed688(o.linkedFromUrls);
   }
   buildCounterUrlSampleDetails--;
 }
@@ -521,14 +525,14 @@
   buildCounterWmxSite--;
 }
 
-buildUnnamed690() {
+buildUnnamed689() {
   var o = new core.List<api.WmxSitemapContent>();
   o.add(buildWmxSitemapContent());
   o.add(buildWmxSitemapContent());
   return o;
 }
 
-checkUnnamed690(core.List<api.WmxSitemapContent> o) {
+checkUnnamed689(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemapContent(o[0]);
   checkWmxSitemapContent(o[1]);
@@ -539,7 +543,7 @@
   var o = new api.WmxSitemap();
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    o.contents = buildUnnamed690();
+    o.contents = buildUnnamed689();
     o.errors = "foo";
     o.isPending = true;
     o.isSitemapsIndex = true;
@@ -556,12 +560,14 @@
 checkWmxSitemap(api.WmxSitemap o) {
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    checkUnnamed690(o.contents);
+    checkUnnamed689(o.contents);
     unittest.expect(o.errors, unittest.equals('foo'));
     unittest.expect(o.isPending, unittest.isTrue);
     unittest.expect(o.isSitemapsIndex, unittest.isTrue);
-    unittest.expect(o.lastDownloaded, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.lastSubmitted, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastDownloaded,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastSubmitted,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.warnings, unittest.equals('foo'));
@@ -592,7 +598,6 @@
   buildCounterWmxSitemapContent--;
 }
 
-
 main() {
   unittest.group("obj-schema-ApiDataRow", () {
     unittest.test("to-json--from-json", () {
@@ -602,7 +607,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApiDimensionFilter", () {
     unittest.test("to-json--from-json", () {
       var o = buildApiDimensionFilter();
@@ -611,7 +615,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ApiDimensionFilterGroup", () {
     unittest.test("to-json--from-json", () {
       var o = buildApiDimensionFilterGroup();
@@ -620,7 +623,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchAnalyticsQueryRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchAnalyticsQueryRequest();
@@ -629,7 +631,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchAnalyticsQueryResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchAnalyticsQueryResponse();
@@ -638,7 +639,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SitemapsListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSitemapsListResponse();
@@ -647,7 +647,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SitesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSitesListResponse();
@@ -656,7 +655,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlCrawlErrorCount", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlCrawlErrorCount();
@@ -665,7 +663,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlCrawlErrorCountsPerType", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlCrawlErrorCountsPerType();
@@ -674,7 +671,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlCrawlErrorsCountsQueryResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlCrawlErrorsCountsQueryResponse();
@@ -683,7 +679,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlCrawlErrorsSample", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlCrawlErrorsSample();
@@ -692,7 +687,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlCrawlErrorsSamplesListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlCrawlErrorsSamplesListResponse();
@@ -701,7 +695,6 @@
     });
   });
 
-
   unittest.group("obj-schema-UrlSampleDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildUrlSampleDetails();
@@ -710,7 +703,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WmxSite", () {
     unittest.test("to-json--from-json", () {
       var o = buildWmxSite();
@@ -719,7 +711,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WmxSitemap", () {
     unittest.test("to-json--from-json", () {
       var o = buildWmxSitemap();
@@ -728,7 +719,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WmxSitemapContent", () {
     unittest.test("to-json--from-json", () {
       var o = buildWmxSitemapContent();
@@ -737,12 +727,11 @@
     });
   });
 
-
   unittest.group("resource-SearchanalyticsResourceApi", () {
     unittest.test("method--query", () {
-
       var mock = new HttpServerMock();
-      api.SearchanalyticsResourceApi res = new api.WebmastersApi(mock).searchanalytics;
+      api.SearchanalyticsResourceApi res =
+          new api.WebmastersApi(mock).searchanalytics;
       var arg_request = buildSearchAnalyticsQueryRequest();
       var arg_siteUrl = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -753,18 +742,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/searchAnalytics/query", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/searchAnalytics/query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/searchAnalytics/query"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -777,31 +771,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchAnalyticsQueryResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.query(arg_request, arg_siteUrl).then(unittest.expectAsync1(((api.SearchAnalyticsQueryResponse response) {
+      res.query(arg_request, arg_siteUrl).then(
+          unittest.expectAsync1(((api.SearchAnalyticsQueryResponse response) {
         checkSearchAnalyticsQueryResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SitemapsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SitemapsResourceApi res = new api.WebmastersApi(mock).sitemaps;
       var arg_siteUrl = "foo";
@@ -811,18 +804,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/sitemaps/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/sitemaps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/sitemaps/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -838,16 +836,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -856,7 +855,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SitemapsResourceApi res = new api.WebmastersApi(mock).sitemaps;
       var arg_siteUrl = "foo";
@@ -866,18 +864,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/sitemaps/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/sitemaps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/sitemaps/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -893,27 +896,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWmxSitemap());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_siteUrl, arg_feedpath).then(unittest.expectAsync1(((api.WmxSitemap response) {
+      res
+          .get(arg_siteUrl, arg_feedpath)
+          .then(unittest.expectAsync1(((api.WmxSitemap response) {
         checkWmxSitemap(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SitemapsResourceApi res = new api.WebmastersApi(mock).sitemaps;
       var arg_siteUrl = "foo";
@@ -923,18 +928,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/sitemaps", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/sitemaps"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/sitemaps"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -947,28 +957,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["sitemapIndex"].first, unittest.equals(arg_sitemapIndex));
-
+        unittest.expect(
+            queryMap["sitemapIndex"].first, unittest.equals(arg_sitemapIndex));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSitemapsListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_siteUrl, sitemapIndex: arg_sitemapIndex).then(unittest.expectAsync1(((api.SitemapsListResponse response) {
+      res
+          .list(arg_siteUrl, sitemapIndex: arg_sitemapIndex)
+          .then(unittest.expectAsync1(((api.SitemapsListResponse response) {
         checkSitemapsListResponse(response);
       })));
     });
 
     unittest.test("method--submit", () {
-
       var mock = new HttpServerMock();
       api.SitemapsResourceApi res = new api.WebmastersApi(mock).sitemaps;
       var arg_siteUrl = "foo";
@@ -978,18 +991,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/sitemaps/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/sitemaps/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("/sitemaps/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1005,29 +1023,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.submit(arg_siteUrl, arg_feedpath).then(unittest.expectAsync1((_) {}));
     });
-
   });
 
-
   unittest.group("resource-SitesResourceApi", () {
     unittest.test("method--add", () {
-
       var mock = new HttpServerMock();
       api.SitesResourceApi res = new api.WebmastersApi(mock).sites;
       var arg_siteUrl = "foo";
@@ -1036,11 +1052,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1056,16 +1075,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1074,7 +1094,6 @@
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SitesResourceApi res = new api.WebmastersApi(mock).sites;
       var arg_siteUrl = "foo";
@@ -1083,11 +1102,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1103,16 +1125,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1121,7 +1144,6 @@
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.SitesResourceApi res = new api.WebmastersApi(mock).sites;
       var arg_siteUrl = "foo";
@@ -1130,11 +1152,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1150,16 +1175,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildWmxSite());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1170,7 +1196,6 @@
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SitesResourceApi res = new api.WebmastersApi(mock).sites;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -1178,11 +1203,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("sites"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5),
+            unittest.equals("sites"));
         pathOffset += 5;
 
         var query = (req.url).query;
@@ -1195,16 +1223,17 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSitesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
@@ -1213,15 +1242,13 @@
         checkSitesListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UrlcrawlerrorscountsResourceApi", () {
     unittest.test("method--query", () {
-
       var mock = new HttpServerMock();
-      api.UrlcrawlerrorscountsResourceApi res = new api.WebmastersApi(mock).urlcrawlerrorscounts;
+      api.UrlcrawlerrorscountsResourceApi res =
+          new api.WebmastersApi(mock).urlcrawlerrorscounts;
       var arg_siteUrl = "foo";
       var arg_category = "foo";
       var arg_latestCountsOnly = true;
@@ -1231,18 +1258,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/urlCrawlErrorsCounts/query", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/urlCrawlErrorsCounts/query"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 27),
+            unittest.equals("/urlCrawlErrorsCounts/query"));
         pathOffset += 27;
 
         var query = (req.url).query;
@@ -1255,36 +1287,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["category"].first, unittest.equals(arg_category));
-        unittest.expect(queryMap["latestCountsOnly"].first, unittest.equals("$arg_latestCountsOnly"));
-        unittest.expect(queryMap["platform"].first, unittest.equals(arg_platform));
-
+        unittest.expect(
+            queryMap["category"].first, unittest.equals(arg_category));
+        unittest.expect(queryMap["latestCountsOnly"].first,
+            unittest.equals("$arg_latestCountsOnly"));
+        unittest.expect(
+            queryMap["platform"].first, unittest.equals(arg_platform));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildUrlCrawlErrorsCountsQueryResponse());
+        var resp =
+            convert.JSON.encode(buildUrlCrawlErrorsCountsQueryResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.query(arg_siteUrl, category: arg_category, latestCountsOnly: arg_latestCountsOnly, platform: arg_platform).then(unittest.expectAsync1(((api.UrlCrawlErrorsCountsQueryResponse response) {
+      res
+          .query(arg_siteUrl,
+              category: arg_category,
+              latestCountsOnly: arg_latestCountsOnly,
+              platform: arg_platform)
+          .then(unittest
+              .expectAsync1(((api.UrlCrawlErrorsCountsQueryResponse response) {
         checkUrlCrawlErrorsCountsQueryResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-UrlcrawlerrorssamplesResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.UrlcrawlerrorssamplesResourceApi res = new api.WebmastersApi(mock).urlcrawlerrorssamples;
+      api.UrlcrawlerrorssamplesResourceApi res =
+          new api.WebmastersApi(mock).urlcrawlerrorssamples;
       var arg_siteUrl = "foo";
       var arg_url = "foo";
       var arg_category = "foo";
@@ -1294,18 +1335,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/urlCrawlErrorsSamples/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/urlCrawlErrorsSamples/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("/urlCrawlErrorsSamples/"));
         pathOffset += 23;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1321,31 +1367,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["category"].first, unittest.equals(arg_category));
-        unittest.expect(queryMap["platform"].first, unittest.equals(arg_platform));
-
+        unittest.expect(
+            queryMap["category"].first, unittest.equals(arg_category));
+        unittest.expect(
+            queryMap["platform"].first, unittest.equals(arg_platform));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildUrlCrawlErrorsSample());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_siteUrl, arg_url, arg_category, arg_platform).then(unittest.expectAsync1(((api.UrlCrawlErrorsSample response) {
+      res
+          .get(arg_siteUrl, arg_url, arg_category, arg_platform)
+          .then(unittest.expectAsync1(((api.UrlCrawlErrorsSample response) {
         checkUrlCrawlErrorsSample(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.UrlcrawlerrorssamplesResourceApi res = new api.WebmastersApi(mock).urlcrawlerrorssamples;
+      api.UrlcrawlerrorssamplesResourceApi res =
+          new api.WebmastersApi(mock).urlcrawlerrorssamples;
       var arg_siteUrl = "foo";
       var arg_category = "foo";
       var arg_platform = "foo";
@@ -1354,18 +1405,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/urlCrawlErrorsSamples", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/urlCrawlErrorsSamples"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("/urlCrawlErrorsSamples"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -1378,31 +1434,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["category"].first, unittest.equals(arg_category));
-        unittest.expect(queryMap["platform"].first, unittest.equals(arg_platform));
-
+        unittest.expect(
+            queryMap["category"].first, unittest.equals(arg_category));
+        unittest.expect(
+            queryMap["platform"].first, unittest.equals(arg_platform));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildUrlCrawlErrorsSamplesListResponse());
+        var resp =
+            convert.JSON.encode(buildUrlCrawlErrorsSamplesListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_siteUrl, arg_category, arg_platform).then(unittest.expectAsync1(((api.UrlCrawlErrorsSamplesListResponse response) {
+      res.list(arg_siteUrl, arg_category, arg_platform).then(unittest
+          .expectAsync1(((api.UrlCrawlErrorsSamplesListResponse response) {
         checkUrlCrawlErrorsSamplesListResponse(response);
       })));
     });
 
     unittest.test("method--markAsFixed", () {
-
       var mock = new HttpServerMock();
-      api.UrlcrawlerrorssamplesResourceApi res = new api.WebmastersApi(mock).urlcrawlerrorssamples;
+      api.UrlcrawlerrorssamplesResourceApi res =
+          new api.WebmastersApi(mock).urlcrawlerrorssamples;
       var arg_siteUrl = "foo";
       var arg_url = "foo";
       var arg_category = "foo";
@@ -1412,18 +1473,23 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("webmasters/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("webmasters/v3/"));
         pathOffset += 14;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("sites/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("sites/"));
         pathOffset += 6;
         index = path.indexOf("/urlCrawlErrorsSamples/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_siteUrl"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/urlCrawlErrorsSamples/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("/urlCrawlErrorsSamples/"));
         pathOffset += 23;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -1439,27 +1505,28 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["category"].first, unittest.equals(arg_category));
-        unittest.expect(queryMap["platform"].first, unittest.equals(arg_platform));
-
+        unittest.expect(
+            queryMap["category"].first, unittest.equals(arg_category));
+        unittest.expect(
+            queryMap["platform"].first, unittest.equals(arg_platform));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.markAsFixed(arg_siteUrl, arg_url, arg_category, arg_platform).then(unittest.expectAsync1((_) {}));
+      res
+          .markAsFixed(arg_siteUrl, arg_url, arg_category, arg_platform)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 5767297..a2dc169 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -1,12 +1,10 @@
 library googleapis.youtube.v3.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/youtube/v3.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,20 +44,20 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
 
-buildUnnamed563() {
+buildUnnamed562() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed563(core.List<core.String> o) {
+checkUnnamed562(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -70,7 +69,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     o.allowed = true;
-    o.exception = buildUnnamed563();
+    o.exception = buildUnnamed562();
   }
   buildCounterAccessPolicy--;
   return o;
@@ -80,7 +79,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     unittest.expect(o.allowed, unittest.isTrue);
-    checkUnnamed563(o.exception);
+    checkUnnamed562(o.exception);
   }
   buildCounterAccessPolicy--;
 }
@@ -181,7 +180,8 @@
   return o;
 }
 
-checkActivityContentDetailsChannelItem(api.ActivityContentDetailsChannelItem o) {
+checkActivityContentDetailsChannelItem(
+    api.ActivityContentDetailsChannelItem o) {
   buildCounterActivityContentDetailsChannelItem++;
   if (buildCounterActivityContentDetailsChannelItem < 3) {
     checkResourceId(o.resourceId);
@@ -259,7 +259,8 @@
   return o;
 }
 
-checkActivityContentDetailsPlaylistItem(api.ActivityContentDetailsPlaylistItem o) {
+checkActivityContentDetailsPlaylistItem(
+    api.ActivityContentDetailsPlaylistItem o) {
   buildCounterActivityContentDetailsPlaylistItem++;
   if (buildCounterActivityContentDetailsPlaylistItem < 3) {
     unittest.expect(o.playlistId, unittest.equals('foo'));
@@ -269,6 +270,19 @@
   buildCounterActivityContentDetailsPlaylistItem--;
 }
 
+buildUnnamed563() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed563(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed564() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -282,19 +296,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed565() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed565(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterActivityContentDetailsPromotedItem = 0;
 buildActivityContentDetailsPromotedItem() {
   var o = new api.ActivityContentDetailsPromotedItem();
@@ -307,15 +308,16 @@
     o.customCtaButtonText = "foo";
     o.descriptionText = "foo";
     o.destinationUrl = "foo";
-    o.forecastingUrl = buildUnnamed564();
-    o.impressionUrl = buildUnnamed565();
+    o.forecastingUrl = buildUnnamed563();
+    o.impressionUrl = buildUnnamed564();
     o.videoId = "foo";
   }
   buildCounterActivityContentDetailsPromotedItem--;
   return o;
 }
 
-checkActivityContentDetailsPromotedItem(api.ActivityContentDetailsPromotedItem o) {
+checkActivityContentDetailsPromotedItem(
+    api.ActivityContentDetailsPromotedItem o) {
   buildCounterActivityContentDetailsPromotedItem++;
   if (buildCounterActivityContentDetailsPromotedItem < 3) {
     unittest.expect(o.adTag, unittest.equals('foo'));
@@ -325,8 +327,8 @@
     unittest.expect(o.customCtaButtonText, unittest.equals('foo'));
     unittest.expect(o.descriptionText, unittest.equals('foo'));
     unittest.expect(o.destinationUrl, unittest.equals('foo'));
-    checkUnnamed564(o.forecastingUrl);
-    checkUnnamed565(o.impressionUrl);
+    checkUnnamed563(o.forecastingUrl);
+    checkUnnamed564(o.impressionUrl);
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -345,7 +347,8 @@
   return o;
 }
 
-checkActivityContentDetailsRecommendation(api.ActivityContentDetailsRecommendation o) {
+checkActivityContentDetailsRecommendation(
+    api.ActivityContentDetailsRecommendation o) {
   buildCounterActivityContentDetailsRecommendation++;
   if (buildCounterActivityContentDetailsRecommendation < 3) {
     unittest.expect(o.reason, unittest.equals('foo'));
@@ -393,7 +396,8 @@
   return o;
 }
 
-checkActivityContentDetailsSubscription(api.ActivityContentDetailsSubscription o) {
+checkActivityContentDetailsSubscription(
+    api.ActivityContentDetailsSubscription o) {
   buildCounterActivityContentDetailsSubscription++;
   if (buildCounterActivityContentDetailsSubscription < 3) {
     checkResourceId(o.resourceId);
@@ -420,14 +424,14 @@
   buildCounterActivityContentDetailsUpload--;
 }
 
-buildUnnamed566() {
+buildUnnamed565() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed566(core.List<api.Activity> o) {
+checkUnnamed565(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -440,7 +444,7 @@
   if (buildCounterActivityListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed566();
+    o.items = buildUnnamed565();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -457,7 +461,7 @@
   if (buildCounterActivityListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed566(o.items);
+    checkUnnamed565(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -493,7 +497,8 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.groupId, unittest.equals('foo'));
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -526,14 +531,14 @@
   buildCounterCaption--;
 }
 
-buildUnnamed567() {
+buildUnnamed566() {
   var o = new core.List<api.Caption>();
   o.add(buildCaption());
   o.add(buildCaption());
   return o;
 }
 
-checkUnnamed567(core.List<api.Caption> o) {
+checkUnnamed566(core.List<api.Caption> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCaption(o[0]);
   checkCaption(o[1]);
@@ -546,7 +551,7 @@
   if (buildCounterCaptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed567();
+    o.items = buildUnnamed566();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -559,7 +564,7 @@
   if (buildCounterCaptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed567(o.items);
+    checkUnnamed566(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -600,7 +605,8 @@
     unittest.expect(o.isEasyReader, unittest.isTrue);
     unittest.expect(o.isLarge, unittest.isTrue);
     unittest.expect(o.language, unittest.equals('foo'));
-    unittest.expect(o.lastUpdated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastUpdated,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trackKind, unittest.equals('foo'));
@@ -636,14 +642,14 @@
   buildCounterCdnSettings--;
 }
 
-buildUnnamed568() {
+buildUnnamed567() {
   var o = new core.Map<core.String, api.ChannelLocalization>();
   o["x"] = buildChannelLocalization();
   o["y"] = buildChannelLocalization();
   return o;
 }
 
-checkUnnamed568(core.Map<core.String, api.ChannelLocalization> o) {
+checkUnnamed567(core.Map<core.String, api.ChannelLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelLocalization(o["x"]);
   checkChannelLocalization(o["y"]);
@@ -663,7 +669,7 @@
     o.id = "foo";
     o.invideoPromotion = buildInvideoPromotion();
     o.kind = "foo";
-    o.localizations = buildUnnamed568();
+    o.localizations = buildUnnamed567();
     o.snippet = buildChannelSnippet();
     o.statistics = buildChannelStatistics();
     o.status = buildChannelStatus();
@@ -685,7 +691,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkInvideoPromotion(o.invideoPromotion);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed568(o.localizations);
+    checkUnnamed567(o.localizations);
     checkChannelSnippet(o.snippet);
     checkChannelStatistics(o.statistics);
     checkChannelStatus(o.status);
@@ -742,14 +748,14 @@
   buildCounterChannelBannerResource--;
 }
 
-buildUnnamed569() {
+buildUnnamed568() {
   var o = new core.List<api.PropertyValue>();
   o.add(buildPropertyValue());
   o.add(buildPropertyValue());
   return o;
 }
 
-checkUnnamed569(core.List<api.PropertyValue> o) {
+checkUnnamed568(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyValue(o[0]);
   checkPropertyValue(o[1]);
@@ -761,7 +767,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     o.channel = buildChannelSettings();
-    o.hints = buildUnnamed569();
+    o.hints = buildUnnamed568();
     o.image = buildImageSettings();
     o.watch = buildWatchSettings();
   }
@@ -773,7 +779,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     checkChannelSettings(o.channel);
-    checkUnnamed569(o.hints);
+    checkUnnamed568(o.hints);
     checkImageSettings(o.image);
     checkWatchSettings(o.watch);
   }
@@ -795,7 +801,8 @@
   return o;
 }
 
-checkChannelContentDetailsRelatedPlaylists(api.ChannelContentDetailsRelatedPlaylists o) {
+checkChannelContentDetailsRelatedPlaylists(
+    api.ChannelContentDetailsRelatedPlaylists o) {
   buildCounterChannelContentDetailsRelatedPlaylists++;
   if (buildCounterChannelContentDetailsRelatedPlaylists < 3) {
     unittest.expect(o.favorites, unittest.equals('foo'));
@@ -842,7 +849,8 @@
   buildCounterChannelContentOwnerDetails++;
   if (buildCounterChannelContentOwnerDetails < 3) {
     unittest.expect(o.contentOwner, unittest.equals('foo'));
-    unittest.expect(o.timeLinked, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.timeLinked,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterChannelContentOwnerDetails--;
 }
@@ -868,14 +876,14 @@
   buildCounterChannelConversionPing--;
 }
 
-buildUnnamed570() {
+buildUnnamed569() {
   var o = new core.List<api.ChannelConversionPing>();
   o.add(buildChannelConversionPing());
   o.add(buildChannelConversionPing());
   return o;
 }
 
-checkUnnamed570(core.List<api.ChannelConversionPing> o) {
+checkUnnamed569(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelConversionPing(o[0]);
   checkChannelConversionPing(o[1]);
@@ -886,7 +894,7 @@
   var o = new api.ChannelConversionPings();
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    o.pings = buildUnnamed570();
+    o.pings = buildUnnamed569();
   }
   buildCounterChannelConversionPings--;
   return o;
@@ -895,19 +903,19 @@
 checkChannelConversionPings(api.ChannelConversionPings o) {
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    checkUnnamed570(o.pings);
+    checkUnnamed569(o.pings);
   }
   buildCounterChannelConversionPings--;
 }
 
-buildUnnamed571() {
+buildUnnamed570() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed571(core.List<api.Channel> o) {
+checkUnnamed570(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -920,7 +928,7 @@
   if (buildCounterChannelListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed571();
+    o.items = buildUnnamed570();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -937,7 +945,7 @@
   if (buildCounterChannelListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed571(o.items);
+    checkUnnamed570(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -994,14 +1002,14 @@
   buildCounterChannelProfileDetails--;
 }
 
-buildUnnamed572() {
+buildUnnamed571() {
   var o = new core.Map<core.String, api.ChannelSectionLocalization>();
   o["x"] = buildChannelSectionLocalization();
   o["y"] = buildChannelSectionLocalization();
   return o;
 }
 
-checkUnnamed572(core.Map<core.String, api.ChannelSectionLocalization> o) {
+checkUnnamed571(core.Map<core.String, api.ChannelSectionLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSectionLocalization(o["x"]);
   checkChannelSectionLocalization(o["y"]);
@@ -1016,7 +1024,7 @@
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.localizations = buildUnnamed572();
+    o.localizations = buildUnnamed571();
     o.snippet = buildChannelSectionSnippet();
     o.targeting = buildChannelSectionTargeting();
   }
@@ -1031,13 +1039,26 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed572(o.localizations);
+    checkUnnamed571(o.localizations);
     checkChannelSectionSnippet(o.snippet);
     checkChannelSectionTargeting(o.targeting);
   }
   buildCounterChannelSection--;
 }
 
+buildUnnamed572() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed572(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed573() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1051,26 +1072,13 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed574() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed574(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterChannelSectionContentDetails = 0;
 buildChannelSectionContentDetails() {
   var o = new api.ChannelSectionContentDetails();
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    o.channels = buildUnnamed573();
-    o.playlists = buildUnnamed574();
+    o.channels = buildUnnamed572();
+    o.playlists = buildUnnamed573();
   }
   buildCounterChannelSectionContentDetails--;
   return o;
@@ -1079,20 +1087,20 @@
 checkChannelSectionContentDetails(api.ChannelSectionContentDetails o) {
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    checkUnnamed573(o.channels);
-    checkUnnamed574(o.playlists);
+    checkUnnamed572(o.channels);
+    checkUnnamed573(o.playlists);
   }
   buildCounterChannelSectionContentDetails--;
 }
 
-buildUnnamed575() {
+buildUnnamed574() {
   var o = new core.List<api.ChannelSection>();
   o.add(buildChannelSection());
   o.add(buildChannelSection());
   return o;
 }
 
-checkUnnamed575(core.List<api.ChannelSection> o) {
+checkUnnamed574(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSection(o[0]);
   checkChannelSection(o[1]);
@@ -1105,7 +1113,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed575();
+    o.items = buildUnnamed574();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1118,7 +1126,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed575(o.items);
+    checkUnnamed574(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1175,6 +1183,19 @@
   buildCounterChannelSectionSnippet--;
 }
 
+buildUnnamed575() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed575(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed576() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1201,27 +1222,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed578() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed578(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterChannelSectionTargeting = 0;
 buildChannelSectionTargeting() {
   var o = new api.ChannelSectionTargeting();
   buildCounterChannelSectionTargeting++;
   if (buildCounterChannelSectionTargeting < 3) {
-    o.countries = buildUnnamed576();
-    o.languages = buildUnnamed577();
-    o.regions = buildUnnamed578();
+    o.countries = buildUnnamed575();
+    o.languages = buildUnnamed576();
+    o.regions = buildUnnamed577();
   }
   buildCounterChannelSectionTargeting--;
   return o;
@@ -1230,21 +1238,21 @@
 checkChannelSectionTargeting(api.ChannelSectionTargeting o) {
   buildCounterChannelSectionTargeting++;
   if (buildCounterChannelSectionTargeting < 3) {
-    checkUnnamed576(o.countries);
-    checkUnnamed577(o.languages);
-    checkUnnamed578(o.regions);
+    checkUnnamed575(o.countries);
+    checkUnnamed576(o.languages);
+    checkUnnamed577(o.regions);
   }
   buildCounterChannelSectionTargeting--;
 }
 
-buildUnnamed579() {
+buildUnnamed578() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed579(core.List<core.String> o) {
+checkUnnamed578(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1260,7 +1268,7 @@
     o.defaultTab = "foo";
     o.description = "foo";
     o.featuredChannelsTitle = "foo";
-    o.featuredChannelsUrls = buildUnnamed579();
+    o.featuredChannelsUrls = buildUnnamed578();
     o.keywords = "foo";
     o.moderateComments = true;
     o.profileColor = "foo";
@@ -1282,7 +1290,7 @@
     unittest.expect(o.defaultTab, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.featuredChannelsTitle, unittest.equals('foo'));
-    checkUnnamed579(o.featuredChannelsUrls);
+    checkUnnamed578(o.featuredChannelsUrls);
     unittest.expect(o.keywords, unittest.equals('foo'));
     unittest.expect(o.moderateComments, unittest.isTrue);
     unittest.expect(o.profileColor, unittest.equals('foo'));
@@ -1321,7 +1329,8 @@
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkChannelLocalization(o.localized);
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -1378,6 +1387,19 @@
   buildCounterChannelStatus--;
 }
 
+buildUnnamed579() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed579(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed580() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1391,26 +1413,13 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed581() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed581(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterChannelTopicDetails = 0;
 buildChannelTopicDetails() {
   var o = new api.ChannelTopicDetails();
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    o.topicCategories = buildUnnamed580();
-    o.topicIds = buildUnnamed581();
+    o.topicCategories = buildUnnamed579();
+    o.topicIds = buildUnnamed580();
   }
   buildCounterChannelTopicDetails--;
   return o;
@@ -1419,8 +1428,8 @@
 checkChannelTopicDetails(api.ChannelTopicDetails o) {
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    checkUnnamed580(o.topicCategories);
-    checkUnnamed581(o.topicIds);
+    checkUnnamed579(o.topicCategories);
+    checkUnnamed580(o.topicIds);
   }
   buildCounterChannelTopicDetails--;
 }
@@ -1450,14 +1459,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed582() {
+buildUnnamed581() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed582(core.List<api.Comment> o) {
+checkUnnamed581(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1470,7 +1479,7 @@
   if (buildCounterCommentListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed582();
+    o.items = buildUnnamed581();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1486,7 +1495,7 @@
   if (buildCounterCommentListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed582(o.items);
+    checkUnnamed581(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1501,7 +1510,11 @@
   var o = new api.CommentSnippet();
   buildCounterCommentSnippet++;
   if (buildCounterCommentSnippet < 3) {
-    o.authorChannelId = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+    o.authorChannelId = {
+      'list': [1, 2, 3],
+      'bool': true,
+      'string': 'foo'
+    };
     o.authorChannelUrl = "foo";
     o.authorDisplayName = "foo";
     o.authorProfileImageUrl = "foo";
@@ -1524,7 +1537,11 @@
 checkCommentSnippet(api.CommentSnippet o) {
   buildCounterCommentSnippet++;
   if (buildCounterCommentSnippet < 3) {
-    var casted1 = (o.authorChannelId) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
+    var casted1 = (o.authorChannelId) as core.Map;
+    unittest.expect(casted1, unittest.hasLength(3));
+    unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+    unittest.expect(casted1["bool"], unittest.equals(true));
+    unittest.expect(casted1["string"], unittest.equals('foo'));
     unittest.expect(o.authorChannelUrl, unittest.equals('foo'));
     unittest.expect(o.authorDisplayName, unittest.equals('foo'));
     unittest.expect(o.authorProfileImageUrl, unittest.equals('foo'));
@@ -1533,10 +1550,12 @@
     unittest.expect(o.likeCount, unittest.equals(42));
     unittest.expect(o.moderationStatus, unittest.equals('foo'));
     unittest.expect(o.parentId, unittest.equals('foo'));
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.textDisplay, unittest.equals('foo'));
     unittest.expect(o.textOriginal, unittest.equals('foo'));
-    unittest.expect(o.updatedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.updatedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.videoId, unittest.equals('foo'));
     unittest.expect(o.viewerRating, unittest.equals('foo'));
   }
@@ -1570,14 +1589,14 @@
   buildCounterCommentThread--;
 }
 
-buildUnnamed583() {
+buildUnnamed582() {
   var o = new core.List<api.CommentThread>();
   o.add(buildCommentThread());
   o.add(buildCommentThread());
   return o;
 }
 
-checkUnnamed583(core.List<api.CommentThread> o) {
+checkUnnamed582(core.List<api.CommentThread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentThread(o[0]);
   checkCommentThread(o[1]);
@@ -1590,7 +1609,7 @@
   if (buildCounterCommentThreadListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed583();
+    o.items = buildUnnamed582();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1606,7 +1625,7 @@
   if (buildCounterCommentThreadListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed583(o.items);
+    checkUnnamed582(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1616,14 +1635,14 @@
   buildCounterCommentThreadListResponse--;
 }
 
-buildUnnamed584() {
+buildUnnamed583() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed584(core.List<api.Comment> o) {
+checkUnnamed583(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -1634,7 +1653,7 @@
   var o = new api.CommentThreadReplies();
   buildCounterCommentThreadReplies++;
   if (buildCounterCommentThreadReplies < 3) {
-    o.comments = buildUnnamed584();
+    o.comments = buildUnnamed583();
   }
   buildCounterCommentThreadReplies--;
   return o;
@@ -1643,7 +1662,7 @@
 checkCommentThreadReplies(api.CommentThreadReplies o) {
   buildCounterCommentThreadReplies++;
   if (buildCounterCommentThreadReplies < 3) {
-    checkUnnamed584(o.comments);
+    checkUnnamed583(o.comments);
   }
   buildCounterCommentThreadReplies--;
 }
@@ -1677,6 +1696,19 @@
   buildCounterCommentThreadSnippet--;
 }
 
+buildUnnamed584() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed584(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed585() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1690,19 +1722,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed586() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed586(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterContentRating = 0;
 buildContentRating() {
   var o = new api.ContentRating();
@@ -1728,7 +1747,7 @@
     o.cscfRating = "foo";
     o.czfilmRating = "foo";
     o.djctqRating = "foo";
-    o.djctqRatingReasons = buildUnnamed585();
+    o.djctqRatingReasons = buildUnnamed584();
     o.ecbmctRating = "foo";
     o.eefilmRating = "foo";
     o.egfilmRating = "foo";
@@ -1737,7 +1756,7 @@
     o.fcoRating = "foo";
     o.fmocRating = "foo";
     o.fpbRating = "foo";
-    o.fpbRatingReasons = buildUnnamed586();
+    o.fpbRatingReasons = buildUnnamed585();
     o.fskRating = "foo";
     o.grfilmRating = "foo";
     o.icaaRating = "foo";
@@ -1804,7 +1823,7 @@
     unittest.expect(o.cscfRating, unittest.equals('foo'));
     unittest.expect(o.czfilmRating, unittest.equals('foo'));
     unittest.expect(o.djctqRating, unittest.equals('foo'));
-    checkUnnamed585(o.djctqRatingReasons);
+    checkUnnamed584(o.djctqRatingReasons);
     unittest.expect(o.ecbmctRating, unittest.equals('foo'));
     unittest.expect(o.eefilmRating, unittest.equals('foo'));
     unittest.expect(o.egfilmRating, unittest.equals('foo'));
@@ -1813,7 +1832,7 @@
     unittest.expect(o.fcoRating, unittest.equals('foo'));
     unittest.expect(o.fmocRating, unittest.equals('foo'));
     unittest.expect(o.fpbRating, unittest.equals('foo'));
-    checkUnnamed586(o.fpbRatingReasons);
+    checkUnnamed585(o.fpbRatingReasons);
     unittest.expect(o.fskRating, unittest.equals('foo'));
     unittest.expect(o.grfilmRating, unittest.equals('foo'));
     unittest.expect(o.icaaRating, unittest.equals('foo'));
@@ -1881,14 +1900,14 @@
   buildCounterFanFundingEvent--;
 }
 
-buildUnnamed587() {
+buildUnnamed586() {
   var o = new core.List<api.FanFundingEvent>();
   o.add(buildFanFundingEvent());
   o.add(buildFanFundingEvent());
   return o;
 }
 
-checkUnnamed587(core.List<api.FanFundingEvent> o) {
+checkUnnamed586(core.List<api.FanFundingEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFanFundingEvent(o[0]);
   checkFanFundingEvent(o[1]);
@@ -1901,7 +1920,7 @@
   if (buildCounterFanFundingEventListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed587();
+    o.items = buildUnnamed586();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1917,7 +1936,7 @@
   if (buildCounterFanFundingEventListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed587(o.items);
+    checkUnnamed586(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1950,7 +1969,8 @@
     unittest.expect(o.amountMicros, unittest.equals('foo'));
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.commentText, unittest.equals('foo'));
-    unittest.expect(o.createdAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.currency, unittest.equals('foo'));
     unittest.expect(o.displayString, unittest.equals('foo'));
     checkChannelProfileDetails(o.supporterDetails);
@@ -2006,14 +2026,14 @@
   buildCounterGuideCategory--;
 }
 
-buildUnnamed588() {
+buildUnnamed587() {
   var o = new core.List<api.GuideCategory>();
   o.add(buildGuideCategory());
   o.add(buildGuideCategory());
   return o;
 }
 
-checkUnnamed588(core.List<api.GuideCategory> o) {
+checkUnnamed587(core.List<api.GuideCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuideCategory(o[0]);
   checkGuideCategory(o[1]);
@@ -2026,7 +2046,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed588();
+    o.items = buildUnnamed587();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2043,7 +2063,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed588(o.items);
+    checkUnnamed587(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2100,14 +2120,14 @@
   buildCounterI18nLanguage--;
 }
 
-buildUnnamed589() {
+buildUnnamed588() {
   var o = new core.List<api.I18nLanguage>();
   o.add(buildI18nLanguage());
   o.add(buildI18nLanguage());
   return o;
 }
 
-checkUnnamed589(core.List<api.I18nLanguage> o) {
+checkUnnamed588(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nLanguage(o[0]);
   checkI18nLanguage(o[1]);
@@ -2120,7 +2140,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed589();
+    o.items = buildUnnamed588();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2133,7 +2153,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed589(o.items);
+    checkUnnamed588(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -2186,14 +2206,14 @@
   buildCounterI18nRegion--;
 }
 
-buildUnnamed590() {
+buildUnnamed589() {
   var o = new core.List<api.I18nRegion>();
   o.add(buildI18nRegion());
   o.add(buildI18nRegion());
   return o;
 }
 
-checkUnnamed590(core.List<api.I18nRegion> o) {
+checkUnnamed589(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nRegion(o[0]);
   checkI18nRegion(o[1]);
@@ -2206,7 +2226,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed590();
+    o.items = buildUnnamed589();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2219,7 +2239,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed590(o.items);
+    checkUnnamed589(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -2379,14 +2399,14 @@
   buildCounterInvideoPosition--;
 }
 
-buildUnnamed591() {
+buildUnnamed590() {
   var o = new core.List<api.PromotedItem>();
   o.add(buildPromotedItem());
   o.add(buildPromotedItem());
   return o;
 }
 
-checkUnnamed591(core.List<api.PromotedItem> o) {
+checkUnnamed590(core.List<api.PromotedItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotedItem(o[0]);
   checkPromotedItem(o[1]);
@@ -2398,7 +2418,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     o.defaultTiming = buildInvideoTiming();
-    o.items = buildUnnamed591();
+    o.items = buildUnnamed590();
     o.position = buildInvideoPosition();
     o.useSmartTiming = true;
   }
@@ -2410,7 +2430,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     checkInvideoTiming(o.defaultTiming);
-    checkUnnamed591(o.items);
+    checkUnnamed590(o.items);
     checkInvideoPosition(o.position);
     unittest.expect(o.useSmartTiming, unittest.isTrue);
   }
@@ -2518,7 +2538,8 @@
   buildCounterLiveBroadcastContentDetails++;
   if (buildCounterLiveBroadcastContentDetails < 3) {
     unittest.expect(o.boundStreamId, unittest.equals('foo'));
-    unittest.expect(o.boundStreamLastUpdateTimeMs, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.boundStreamLastUpdateTimeMs,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.closedCaptionsType, unittest.equals('foo'));
     unittest.expect(o.enableClosedCaptions, unittest.isTrue);
     unittest.expect(o.enableContentEncryption, unittest.isTrue);
@@ -2533,14 +2554,14 @@
   buildCounterLiveBroadcastContentDetails--;
 }
 
-buildUnnamed592() {
+buildUnnamed591() {
   var o = new core.List<api.LiveBroadcast>();
   o.add(buildLiveBroadcast());
   o.add(buildLiveBroadcast());
   return o;
 }
 
-checkUnnamed592(core.List<api.LiveBroadcast> o) {
+checkUnnamed591(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcast(o[0]);
   checkLiveBroadcast(o[1]);
@@ -2553,7 +2574,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed592();
+    o.items = buildUnnamed591();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2570,7 +2591,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed592(o.items);
+    checkUnnamed591(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2605,15 +2626,20 @@
 checkLiveBroadcastSnippet(api.LiveBroadcastSnippet o) {
   buildCounterLiveBroadcastSnippet++;
   if (buildCounterLiveBroadcastSnippet < 3) {
-    unittest.expect(o.actualEndTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.actualStartTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.actualEndTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.actualStartTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isDefaultBroadcast, unittest.isTrue);
     unittest.expect(o.liveChatId, unittest.equals('foo'));
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.scheduledEndTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.scheduledStartTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.scheduledEndTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.scheduledStartTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -2689,14 +2715,14 @@
   buildCounterLiveBroadcastTopic--;
 }
 
-buildUnnamed593() {
+buildUnnamed592() {
   var o = new core.List<api.LiveBroadcastTopic>();
   o.add(buildLiveBroadcastTopic());
   o.add(buildLiveBroadcastTopic());
   return o;
 }
 
-checkUnnamed593(core.List<api.LiveBroadcastTopic> o) {
+checkUnnamed592(core.List<api.LiveBroadcastTopic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcastTopic(o[0]);
   checkLiveBroadcastTopic(o[1]);
@@ -2707,7 +2733,7 @@
   var o = new api.LiveBroadcastTopicDetails();
   buildCounterLiveBroadcastTopicDetails++;
   if (buildCounterLiveBroadcastTopicDetails < 3) {
-    o.topics = buildUnnamed593();
+    o.topics = buildUnnamed592();
   }
   buildCounterLiveBroadcastTopicDetails--;
   return o;
@@ -2716,7 +2742,7 @@
 checkLiveBroadcastTopicDetails(api.LiveBroadcastTopicDetails o) {
   buildCounterLiveBroadcastTopicDetails++;
   if (buildCounterLiveBroadcastTopicDetails < 3) {
-    checkUnnamed593(o.topics);
+    checkUnnamed592(o.topics);
   }
   buildCounterLiveBroadcastTopicDetails--;
 }
@@ -2896,14 +2922,14 @@
   buildCounterLiveChatMessageDeletedDetails--;
 }
 
-buildUnnamed594() {
+buildUnnamed593() {
   var o = new core.List<api.LiveChatMessage>();
   o.add(buildLiveChatMessage());
   o.add(buildLiveChatMessage());
   return o;
 }
 
-checkUnnamed594(core.List<api.LiveChatMessage> o) {
+checkUnnamed593(core.List<api.LiveChatMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatMessage(o[0]);
   checkLiveChatMessage(o[1]);
@@ -2916,7 +2942,7 @@
   if (buildCounterLiveChatMessageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed594();
+    o.items = buildUnnamed593();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.offlineAt = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2934,10 +2960,11 @@
   if (buildCounterLiveChatMessageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed594(o.items);
+    checkUnnamed593(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    unittest.expect(o.offlineAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.offlineAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkPageInfo(o.pageInfo);
     unittest.expect(o.pollingIntervalMillis, unittest.equals(42));
     checkTokenPagination(o.tokenPagination);
@@ -3005,7 +3032,8 @@
     checkLiveChatPollEditedDetails(o.pollEditedDetails);
     checkLiveChatPollOpenedDetails(o.pollOpenedDetails);
     checkLiveChatPollVotedDetails(o.pollVotedDetails);
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkLiveChatSuperChatDetails(o.superChatDetails);
     checkLiveChatTextMessageDetails(o.textMessageDetails);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -3039,14 +3067,14 @@
   buildCounterLiveChatModerator--;
 }
 
-buildUnnamed595() {
+buildUnnamed594() {
   var o = new core.List<api.LiveChatModerator>();
   o.add(buildLiveChatModerator());
   o.add(buildLiveChatModerator());
   return o;
 }
 
-checkUnnamed595(core.List<api.LiveChatModerator> o) {
+checkUnnamed594(core.List<api.LiveChatModerator> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatModerator(o[0]);
   checkLiveChatModerator(o[1]);
@@ -3059,7 +3087,7 @@
   if (buildCounterLiveChatModeratorListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed595();
+    o.items = buildUnnamed594();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3076,7 +3104,7 @@
   if (buildCounterLiveChatModeratorListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed595(o.items);
+    checkUnnamed594(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3127,14 +3155,14 @@
   buildCounterLiveChatPollClosedDetails--;
 }
 
-buildUnnamed596() {
+buildUnnamed595() {
   var o = new core.List<api.LiveChatPollItem>();
   o.add(buildLiveChatPollItem());
   o.add(buildLiveChatPollItem());
   return o;
 }
 
-checkUnnamed596(core.List<api.LiveChatPollItem> o) {
+checkUnnamed595(core.List<api.LiveChatPollItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatPollItem(o[0]);
   checkLiveChatPollItem(o[1]);
@@ -3146,7 +3174,7 @@
   buildCounterLiveChatPollEditedDetails++;
   if (buildCounterLiveChatPollEditedDetails < 3) {
     o.id = "foo";
-    o.items = buildUnnamed596();
+    o.items = buildUnnamed595();
     o.prompt = "foo";
   }
   buildCounterLiveChatPollEditedDetails--;
@@ -3157,7 +3185,7 @@
   buildCounterLiveChatPollEditedDetails++;
   if (buildCounterLiveChatPollEditedDetails < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed596(o.items);
+    checkUnnamed595(o.items);
     unittest.expect(o.prompt, unittest.equals('foo'));
   }
   buildCounterLiveChatPollEditedDetails--;
@@ -3184,14 +3212,14 @@
   buildCounterLiveChatPollItem--;
 }
 
-buildUnnamed597() {
+buildUnnamed596() {
   var o = new core.List<api.LiveChatPollItem>();
   o.add(buildLiveChatPollItem());
   o.add(buildLiveChatPollItem());
   return o;
 }
 
-checkUnnamed597(core.List<api.LiveChatPollItem> o) {
+checkUnnamed596(core.List<api.LiveChatPollItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveChatPollItem(o[0]);
   checkLiveChatPollItem(o[1]);
@@ -3203,7 +3231,7 @@
   buildCounterLiveChatPollOpenedDetails++;
   if (buildCounterLiveChatPollOpenedDetails < 3) {
     o.id = "foo";
-    o.items = buildUnnamed597();
+    o.items = buildUnnamed596();
     o.prompt = "foo";
   }
   buildCounterLiveChatPollOpenedDetails--;
@@ -3214,7 +3242,7 @@
   buildCounterLiveChatPollOpenedDetails++;
   if (buildCounterLiveChatPollOpenedDetails < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed597(o.items);
+    checkUnnamed596(o.items);
     unittest.expect(o.prompt, unittest.equals('foo'));
   }
   buildCounterLiveChatPollOpenedDetails--;
@@ -3387,14 +3415,14 @@
   buildCounterLiveStreamContentDetails--;
 }
 
-buildUnnamed598() {
+buildUnnamed597() {
   var o = new core.List<api.LiveStreamConfigurationIssue>();
   o.add(buildLiveStreamConfigurationIssue());
   o.add(buildLiveStreamConfigurationIssue());
   return o;
 }
 
-checkUnnamed598(core.List<api.LiveStreamConfigurationIssue> o) {
+checkUnnamed597(core.List<api.LiveStreamConfigurationIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStreamConfigurationIssue(o[0]);
   checkLiveStreamConfigurationIssue(o[1]);
@@ -3405,7 +3433,7 @@
   var o = new api.LiveStreamHealthStatus();
   buildCounterLiveStreamHealthStatus++;
   if (buildCounterLiveStreamHealthStatus < 3) {
-    o.configurationIssues = buildUnnamed598();
+    o.configurationIssues = buildUnnamed597();
     o.lastUpdateTimeSeconds = "foo";
     o.status = "foo";
   }
@@ -3416,21 +3444,21 @@
 checkLiveStreamHealthStatus(api.LiveStreamHealthStatus o) {
   buildCounterLiveStreamHealthStatus++;
   if (buildCounterLiveStreamHealthStatus < 3) {
-    checkUnnamed598(o.configurationIssues);
+    checkUnnamed597(o.configurationIssues);
     unittest.expect(o.lastUpdateTimeSeconds, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterLiveStreamHealthStatus--;
 }
 
-buildUnnamed599() {
+buildUnnamed598() {
   var o = new core.List<api.LiveStream>();
   o.add(buildLiveStream());
   o.add(buildLiveStream());
   return o;
 }
 
-checkUnnamed599(core.List<api.LiveStream> o) {
+checkUnnamed598(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStream(o[0]);
   checkLiveStream(o[1]);
@@ -3443,7 +3471,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed599();
+    o.items = buildUnnamed598();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3460,7 +3488,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed599(o.items);
+    checkUnnamed598(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3492,7 +3520,8 @@
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isDefaultStream, unittest.isTrue);
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterLiveStreamSnippet--;
@@ -3519,14 +3548,14 @@
   buildCounterLiveStreamStatus--;
 }
 
-buildUnnamed600() {
+buildUnnamed599() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed600(core.List<api.LocalizedString> o) {
+checkUnnamed599(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -3539,7 +3568,7 @@
   if (buildCounterLocalizedProperty < 3) {
     o.default_ = "foo";
     o.defaultLanguage = buildLanguageTag();
-    o.localized = buildUnnamed600();
+    o.localized = buildUnnamed599();
   }
   buildCounterLocalizedProperty--;
   return o;
@@ -3550,7 +3579,7 @@
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
     checkLanguageTag(o.defaultLanguage);
-    checkUnnamed600(o.localized);
+    checkUnnamed599(o.localized);
   }
   buildCounterLocalizedProperty--;
 }
@@ -3620,14 +3649,14 @@
   buildCounterPageInfo--;
 }
 
-buildUnnamed601() {
+buildUnnamed600() {
   var o = new core.Map<core.String, api.PlaylistLocalization>();
   o["x"] = buildPlaylistLocalization();
   o["y"] = buildPlaylistLocalization();
   return o;
 }
 
-checkUnnamed601(core.Map<core.String, api.PlaylistLocalization> o) {
+checkUnnamed600(core.Map<core.String, api.PlaylistLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistLocalization(o["x"]);
   checkPlaylistLocalization(o["y"]);
@@ -3642,7 +3671,7 @@
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.localizations = buildUnnamed601();
+    o.localizations = buildUnnamed600();
     o.player = buildPlaylistPlayer();
     o.snippet = buildPlaylistSnippet();
     o.status = buildPlaylistStatus();
@@ -3658,7 +3687,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed601(o.localizations);
+    checkUnnamed600(o.localizations);
     checkPlaylistPlayer(o.player);
     checkPlaylistSnippet(o.snippet);
     checkPlaylistStatus(o.status);
@@ -3736,19 +3765,20 @@
     unittest.expect(o.note, unittest.equals('foo'));
     unittest.expect(o.startAt, unittest.equals('foo'));
     unittest.expect(o.videoId, unittest.equals('foo'));
-    unittest.expect(o.videoPublishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.videoPublishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterPlaylistItemContentDetails--;
 }
 
-buildUnnamed602() {
+buildUnnamed601() {
   var o = new core.List<api.PlaylistItem>();
   o.add(buildPlaylistItem());
   o.add(buildPlaylistItem());
   return o;
 }
 
-checkUnnamed602(core.List<api.PlaylistItem> o) {
+checkUnnamed601(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistItem(o[0]);
   checkPlaylistItem(o[1]);
@@ -3761,7 +3791,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed602();
+    o.items = buildUnnamed601();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3778,7 +3808,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed602(o.items);
+    checkUnnamed601(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3816,7 +3846,8 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.playlistId, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals(42));
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkResourceId(o.resourceId);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -3843,14 +3874,14 @@
   buildCounterPlaylistItemStatus--;
 }
 
-buildUnnamed603() {
+buildUnnamed602() {
   var o = new core.List<api.Playlist>();
   o.add(buildPlaylist());
   o.add(buildPlaylist());
   return o;
 }
 
-checkUnnamed603(core.List<api.Playlist> o) {
+checkUnnamed602(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylist(o[0]);
   checkPlaylist(o[1]);
@@ -3863,7 +3894,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed603();
+    o.items = buildUnnamed602();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3880,7 +3911,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed603(o.items);
+    checkUnnamed602(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3931,14 +3962,14 @@
   buildCounterPlaylistPlayer--;
 }
 
-buildUnnamed604() {
+buildUnnamed603() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed604(core.List<core.String> o) {
+checkUnnamed603(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3955,7 +3986,7 @@
     o.description = "foo";
     o.localized = buildPlaylistLocalization();
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed604();
+    o.tags = buildUnnamed603();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -3971,8 +4002,9 @@
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkPlaylistLocalization(o.localized);
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed604(o.tags);
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed603(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -4094,14 +4126,14 @@
   buildCounterResourceId--;
 }
 
-buildUnnamed605() {
+buildUnnamed604() {
   var o = new core.List<api.SearchResult>();
   o.add(buildSearchResult());
   o.add(buildSearchResult());
   return o;
 }
 
-checkUnnamed605(core.List<api.SearchResult> o) {
+checkUnnamed604(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSearchResult(o[0]);
   checkSearchResult(o[1]);
@@ -4114,7 +4146,7 @@
   if (buildCounterSearchListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed605();
+    o.items = buildUnnamed604();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4132,7 +4164,7 @@
   if (buildCounterSearchListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed605(o.items);
+    checkUnnamed604(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4193,7 +4225,8 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -4225,14 +4258,14 @@
   buildCounterSponsor--;
 }
 
-buildUnnamed606() {
+buildUnnamed605() {
   var o = new core.List<api.Sponsor>();
   o.add(buildSponsor());
   o.add(buildSponsor());
   return o;
 }
 
-checkUnnamed606(core.List<api.Sponsor> o) {
+checkUnnamed605(core.List<api.Sponsor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSponsor(o[0]);
   checkSponsor(o[1]);
@@ -4245,7 +4278,7 @@
   if (buildCounterSponsorListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed606();
+    o.items = buildUnnamed605();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4261,7 +4294,7 @@
   if (buildCounterSponsorListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed606(o.items);
+    checkUnnamed605(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4289,7 +4322,8 @@
   if (buildCounterSponsorSnippet < 3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
     checkChannelProfileDetails(o.sponsorDetails);
-    unittest.expect(o.sponsorSince, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.sponsorSince,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterSponsorSnippet--;
 }
@@ -4346,14 +4380,14 @@
   buildCounterSubscriptionContentDetails--;
 }
 
-buildUnnamed607() {
+buildUnnamed606() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed607(core.List<api.Subscription> o) {
+checkUnnamed606(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -4366,7 +4400,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed607();
+    o.items = buildUnnamed606();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4383,7 +4417,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed607(o.items);
+    checkUnnamed606(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4417,7 +4451,8 @@
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkResourceId(o.resourceId);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -4475,14 +4510,14 @@
   buildCounterSuperChatEvent--;
 }
 
-buildUnnamed608() {
+buildUnnamed607() {
   var o = new core.List<api.SuperChatEvent>();
   o.add(buildSuperChatEvent());
   o.add(buildSuperChatEvent());
   return o;
 }
 
-checkUnnamed608(core.List<api.SuperChatEvent> o) {
+checkUnnamed607(core.List<api.SuperChatEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSuperChatEvent(o[0]);
   checkSuperChatEvent(o[1]);
@@ -4495,7 +4530,7 @@
   if (buildCounterSuperChatEventListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed608();
+    o.items = buildUnnamed607();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4511,7 +4546,7 @@
   if (buildCounterSuperChatEventListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed608(o.items);
+    checkUnnamed607(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -4545,7 +4580,8 @@
     unittest.expect(o.amountMicros, unittest.equals('foo'));
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.commentText, unittest.equals('foo'));
-    unittest.expect(o.createdAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.createdAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.currency, unittest.equals('foo'));
     unittest.expect(o.displayString, unittest.equals('foo'));
     unittest.expect(o.messageType, unittest.equals(42));
@@ -4604,14 +4640,14 @@
   buildCounterThumbnailDetails--;
 }
 
-buildUnnamed609() {
+buildUnnamed608() {
   var o = new core.List<api.ThumbnailDetails>();
   o.add(buildThumbnailDetails());
   o.add(buildThumbnailDetails());
   return o;
 }
 
-checkUnnamed609(core.List<api.ThumbnailDetails> o) {
+checkUnnamed608(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThumbnailDetails(o[0]);
   checkThumbnailDetails(o[1]);
@@ -4624,7 +4660,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed609();
+    o.items = buildUnnamed608();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -4637,7 +4673,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed609(o.items);
+    checkUnnamed608(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -4648,27 +4684,25 @@
 buildTokenPagination() {
   var o = new api.TokenPagination();
   buildCounterTokenPagination++;
-  if (buildCounterTokenPagination < 3) {
-  }
+  if (buildCounterTokenPagination < 3) {}
   buildCounterTokenPagination--;
   return o;
 }
 
 checkTokenPagination(api.TokenPagination o) {
   buildCounterTokenPagination++;
-  if (buildCounterTokenPagination < 3) {
-  }
+  if (buildCounterTokenPagination < 3) {}
   buildCounterTokenPagination--;
 }
 
-buildUnnamed610() {
+buildUnnamed609() {
   var o = new core.Map<core.String, api.VideoLocalization>();
   o["x"] = buildVideoLocalization();
   o["y"] = buildVideoLocalization();
   return o;
 }
 
-checkUnnamed610(core.Map<core.String, api.VideoLocalization> o) {
+checkUnnamed609(core.Map<core.String, api.VideoLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoLocalization(o["x"]);
   checkVideoLocalization(o["y"]);
@@ -4686,7 +4720,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.liveStreamingDetails = buildVideoLiveStreamingDetails();
-    o.localizations = buildUnnamed610();
+    o.localizations = buildUnnamed609();
     o.monetizationDetails = buildVideoMonetizationDetails();
     o.player = buildVideoPlayer();
     o.processingDetails = buildVideoProcessingDetails();
@@ -4712,7 +4746,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkVideoLiveStreamingDetails(o.liveStreamingDetails);
-    checkUnnamed610(o.localizations);
+    checkUnnamed609(o.localizations);
     checkVideoMonetizationDetails(o.monetizationDetails);
     checkVideoPlayer(o.player);
     checkVideoProcessingDetails(o.processingDetails);
@@ -4779,14 +4813,14 @@
   buildCounterVideoAbuseReportReason--;
 }
 
-buildUnnamed611() {
+buildUnnamed610() {
   var o = new core.List<api.VideoAbuseReportReason>();
   o.add(buildVideoAbuseReportReason());
   o.add(buildVideoAbuseReportReason());
   return o;
 }
 
-checkUnnamed611(core.List<api.VideoAbuseReportReason> o) {
+checkUnnamed610(core.List<api.VideoAbuseReportReason> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoAbuseReportReason(o[0]);
   checkVideoAbuseReportReason(o[1]);
@@ -4799,7 +4833,7 @@
   if (buildCounterVideoAbuseReportReasonListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed611();
+    o.items = buildUnnamed610();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -4807,26 +4841,27 @@
   return o;
 }
 
-checkVideoAbuseReportReasonListResponse(api.VideoAbuseReportReasonListResponse o) {
+checkVideoAbuseReportReasonListResponse(
+    api.VideoAbuseReportReasonListResponse o) {
   buildCounterVideoAbuseReportReasonListResponse++;
   if (buildCounterVideoAbuseReportReasonListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed611(o.items);
+    checkUnnamed610(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoAbuseReportReasonListResponse--;
 }
 
-buildUnnamed612() {
+buildUnnamed611() {
   var o = new core.List<api.VideoAbuseReportSecondaryReason>();
   o.add(buildVideoAbuseReportSecondaryReason());
   o.add(buildVideoAbuseReportSecondaryReason());
   return o;
 }
 
-checkUnnamed612(core.List<api.VideoAbuseReportSecondaryReason> o) {
+checkUnnamed611(core.List<api.VideoAbuseReportSecondaryReason> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoAbuseReportSecondaryReason(o[0]);
   checkVideoAbuseReportSecondaryReason(o[1]);
@@ -4838,7 +4873,7 @@
   buildCounterVideoAbuseReportReasonSnippet++;
   if (buildCounterVideoAbuseReportReasonSnippet < 3) {
     o.label = "foo";
-    o.secondaryReasons = buildUnnamed612();
+    o.secondaryReasons = buildUnnamed611();
   }
   buildCounterVideoAbuseReportReasonSnippet--;
   return o;
@@ -4848,7 +4883,7 @@
   buildCounterVideoAbuseReportReasonSnippet++;
   if (buildCounterVideoAbuseReportReasonSnippet < 3) {
     unittest.expect(o.label, unittest.equals('foo'));
-    checkUnnamed612(o.secondaryReasons);
+    checkUnnamed611(o.secondaryReasons);
   }
   buildCounterVideoAbuseReportReasonSnippet--;
 }
@@ -4922,14 +4957,14 @@
   buildCounterVideoCategory--;
 }
 
-buildUnnamed613() {
+buildUnnamed612() {
   var o = new core.List<api.VideoCategory>();
   o.add(buildVideoCategory());
   o.add(buildVideoCategory());
   return o;
 }
 
-checkUnnamed613(core.List<api.VideoCategory> o) {
+checkUnnamed612(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoCategory(o[0]);
   checkVideoCategory(o[1]);
@@ -4942,7 +4977,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed613();
+    o.items = buildUnnamed612();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -4959,7 +4994,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed613(o.items);
+    checkUnnamed612(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -5030,6 +5065,19 @@
   buildCounterVideoContentDetails--;
 }
 
+buildUnnamed613() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed613(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed614() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -5043,61 +5091,49 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed615() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed615(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterVideoContentDetailsRegionRestriction = 0;
 buildVideoContentDetailsRegionRestriction() {
   var o = new api.VideoContentDetailsRegionRestriction();
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    o.allowed = buildUnnamed614();
-    o.blocked = buildUnnamed615();
+    o.allowed = buildUnnamed613();
+    o.blocked = buildUnnamed614();
   }
   buildCounterVideoContentDetailsRegionRestriction--;
   return o;
 }
 
-checkVideoContentDetailsRegionRestriction(api.VideoContentDetailsRegionRestriction o) {
+checkVideoContentDetailsRegionRestriction(
+    api.VideoContentDetailsRegionRestriction o) {
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    checkUnnamed614(o.allowed);
-    checkUnnamed615(o.blocked);
+    checkUnnamed613(o.allowed);
+    checkUnnamed614(o.blocked);
   }
   buildCounterVideoContentDetailsRegionRestriction--;
 }
 
-buildUnnamed616() {
+buildUnnamed615() {
   var o = new core.List<api.VideoFileDetailsAudioStream>();
   o.add(buildVideoFileDetailsAudioStream());
   o.add(buildVideoFileDetailsAudioStream());
   return o;
 }
 
-checkUnnamed616(core.List<api.VideoFileDetailsAudioStream> o) {
+checkUnnamed615(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsAudioStream(o[0]);
   checkVideoFileDetailsAudioStream(o[1]);
 }
 
-buildUnnamed617() {
+buildUnnamed616() {
   var o = new core.List<api.VideoFileDetailsVideoStream>();
   o.add(buildVideoFileDetailsVideoStream());
   o.add(buildVideoFileDetailsVideoStream());
   return o;
 }
 
-checkUnnamed617(core.List<api.VideoFileDetailsVideoStream> o) {
+checkUnnamed616(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsVideoStream(o[0]);
   checkVideoFileDetailsVideoStream(o[1]);
@@ -5108,7 +5144,7 @@
   var o = new api.VideoFileDetails();
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    o.audioStreams = buildUnnamed616();
+    o.audioStreams = buildUnnamed615();
     o.bitrateBps = "foo";
     o.container = "foo";
     o.creationTime = "foo";
@@ -5116,7 +5152,7 @@
     o.fileName = "foo";
     o.fileSize = "foo";
     o.fileType = "foo";
-    o.videoStreams = buildUnnamed617();
+    o.videoStreams = buildUnnamed616();
   }
   buildCounterVideoFileDetails--;
   return o;
@@ -5125,7 +5161,7 @@
 checkVideoFileDetails(api.VideoFileDetails o) {
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    checkUnnamed616(o.audioStreams);
+    checkUnnamed615(o.audioStreams);
     unittest.expect(o.bitrateBps, unittest.equals('foo'));
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
@@ -5133,7 +5169,7 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.fileType, unittest.equals('foo'));
-    checkUnnamed617(o.videoStreams);
+    checkUnnamed616(o.videoStreams);
   }
   buildCounterVideoFileDetails--;
 }
@@ -5196,14 +5232,14 @@
   buildCounterVideoFileDetailsVideoStream--;
 }
 
-buildUnnamed618() {
+buildUnnamed617() {
   var o = new core.List<api.VideoRating>();
   o.add(buildVideoRating());
   o.add(buildVideoRating());
   return o;
 }
 
-checkUnnamed618(core.List<api.VideoRating> o) {
+checkUnnamed617(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoRating(o[0]);
   checkVideoRating(o[1]);
@@ -5216,7 +5252,7 @@
   if (buildCounterVideoGetRatingResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed618();
+    o.items = buildUnnamed617();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -5229,21 +5265,21 @@
   if (buildCounterVideoGetRatingResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed618(o.items);
+    checkUnnamed617(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoGetRatingResponse--;
 }
 
-buildUnnamed619() {
+buildUnnamed618() {
   var o = new core.List<api.Video>();
   o.add(buildVideo());
   o.add(buildVideo());
   return o;
 }
 
-checkUnnamed619(core.List<api.Video> o) {
+checkUnnamed618(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideo(o[0]);
   checkVideo(o[1]);
@@ -5256,7 +5292,7 @@
   if (buildCounterVideoListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed619();
+    o.items = buildUnnamed618();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -5273,7 +5309,7 @@
   if (buildCounterVideoListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed619(o.items);
+    checkUnnamed618(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -5304,11 +5340,15 @@
   buildCounterVideoLiveStreamingDetails++;
   if (buildCounterVideoLiveStreamingDetails < 3) {
     unittest.expect(o.activeLiveChatId, unittest.equals('foo'));
-    unittest.expect(o.actualEndTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.actualStartTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.actualEndTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.actualStartTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.concurrentViewers, unittest.equals('foo'));
-    unittest.expect(o.scheduledEndTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.scheduledStartTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.scheduledEndTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.scheduledStartTime,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterVideoLiveStreamingDetails--;
 }
@@ -5422,7 +5462,8 @@
   return o;
 }
 
-checkVideoProcessingDetailsProcessingProgress(api.VideoProcessingDetailsProcessingProgress o) {
+checkVideoProcessingDetailsProcessingProgress(
+    api.VideoProcessingDetailsProcessingProgress o) {
   buildCounterVideoProcessingDetailsProcessingProgress++;
   if (buildCounterVideoProcessingDetailsProcessingProgress < 3) {
     unittest.expect(o.partsProcessed, unittest.equals('foo'));
@@ -5432,14 +5473,14 @@
   buildCounterVideoProcessingDetailsProcessingProgress--;
 }
 
-buildUnnamed620() {
+buildUnnamed619() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed620(core.List<core.String> o) {
+checkUnnamed619(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5450,7 +5491,7 @@
   var o = new api.VideoProjectDetails();
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    o.tags = buildUnnamed620();
+    o.tags = buildUnnamed619();
   }
   buildCounterVideoProjectDetails--;
   return o;
@@ -5459,7 +5500,7 @@
 checkVideoProjectDetails(api.VideoProjectDetails o) {
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    checkUnnamed620(o.tags);
+    checkUnnamed619(o.tags);
   }
   buildCounterVideoProjectDetails--;
 }
@@ -5503,19 +5544,20 @@
   if (buildCounterVideoRecordingDetails < 3) {
     checkGeoPoint(o.location);
     unittest.expect(o.locationDescription, unittest.equals('foo'));
-    unittest.expect(o.recordingDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.recordingDate,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterVideoRecordingDetails--;
 }
 
-buildUnnamed621() {
+buildUnnamed620() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed621(core.List<core.String> o) {
+checkUnnamed620(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -5535,7 +5577,7 @@
     o.liveBroadcastContent = "foo";
     o.localized = buildVideoLocalization();
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed621();
+    o.tags = buildUnnamed620();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -5554,8 +5596,9 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
     checkVideoLocalization(o.localized);
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed621(o.tags);
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed620(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -5615,13 +5658,27 @@
     unittest.expect(o.license, unittest.equals('foo'));
     unittest.expect(o.privacyStatus, unittest.equals('foo'));
     unittest.expect(o.publicStatsViewable, unittest.isTrue);
-    unittest.expect(o.publishAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.rejectionReason, unittest.equals('foo'));
     unittest.expect(o.uploadStatus, unittest.equals('foo'));
   }
   buildCounterVideoStatus--;
 }
 
+buildUnnamed621() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed621(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 buildUnnamed622() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -5662,26 +5719,13 @@
 }
 
 buildUnnamed625() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed625(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed626() {
   var o = new core.List<api.VideoSuggestionsTagSuggestion>();
   o.add(buildVideoSuggestionsTagSuggestion());
   o.add(buildVideoSuggestionsTagSuggestion());
   return o;
 }
 
-checkUnnamed626(core.List<api.VideoSuggestionsTagSuggestion> o) {
+checkUnnamed625(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoSuggestionsTagSuggestion(o[0]);
   checkVideoSuggestionsTagSuggestion(o[1]);
@@ -5692,11 +5736,11 @@
   var o = new api.VideoSuggestions();
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    o.editorSuggestions = buildUnnamed622();
-    o.processingErrors = buildUnnamed623();
-    o.processingHints = buildUnnamed624();
-    o.processingWarnings = buildUnnamed625();
-    o.tagSuggestions = buildUnnamed626();
+    o.editorSuggestions = buildUnnamed621();
+    o.processingErrors = buildUnnamed622();
+    o.processingHints = buildUnnamed623();
+    o.processingWarnings = buildUnnamed624();
+    o.tagSuggestions = buildUnnamed625();
   }
   buildCounterVideoSuggestions--;
   return o;
@@ -5705,15 +5749,49 @@
 checkVideoSuggestions(api.VideoSuggestions o) {
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    checkUnnamed622(o.editorSuggestions);
-    checkUnnamed623(o.processingErrors);
-    checkUnnamed624(o.processingHints);
-    checkUnnamed625(o.processingWarnings);
-    checkUnnamed626(o.tagSuggestions);
+    checkUnnamed621(o.editorSuggestions);
+    checkUnnamed622(o.processingErrors);
+    checkUnnamed623(o.processingHints);
+    checkUnnamed624(o.processingWarnings);
+    checkUnnamed625(o.tagSuggestions);
   }
   buildCounterVideoSuggestions--;
 }
 
+buildUnnamed626() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed626(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterVideoSuggestionsTagSuggestion = 0;
+buildVideoSuggestionsTagSuggestion() {
+  var o = new api.VideoSuggestionsTagSuggestion();
+  buildCounterVideoSuggestionsTagSuggestion++;
+  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
+    o.categoryRestricts = buildUnnamed626();
+    o.tag = "foo";
+  }
+  buildCounterVideoSuggestionsTagSuggestion--;
+  return o;
+}
+
+checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
+  buildCounterVideoSuggestionsTagSuggestion++;
+  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
+    checkUnnamed626(o.categoryRestricts);
+    unittest.expect(o.tag, unittest.equals('foo'));
+  }
+  buildCounterVideoSuggestionsTagSuggestion--;
+}
+
 buildUnnamed627() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -5727,27 +5805,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterVideoSuggestionsTagSuggestion = 0;
-buildVideoSuggestionsTagSuggestion() {
-  var o = new api.VideoSuggestionsTagSuggestion();
-  buildCounterVideoSuggestionsTagSuggestion++;
-  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    o.categoryRestricts = buildUnnamed627();
-    o.tag = "foo";
-  }
-  buildCounterVideoSuggestionsTagSuggestion--;
-  return o;
-}
-
-checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
-  buildCounterVideoSuggestionsTagSuggestion++;
-  if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    checkUnnamed627(o.categoryRestricts);
-    unittest.expect(o.tag, unittest.equals('foo'));
-  }
-  buildCounterVideoSuggestionsTagSuggestion--;
-}
-
 buildUnnamed628() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -5774,27 +5831,14 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed630() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed630(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 core.int buildCounterVideoTopicDetails = 0;
 buildVideoTopicDetails() {
   var o = new api.VideoTopicDetails();
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    o.relevantTopicIds = buildUnnamed628();
-    o.topicCategories = buildUnnamed629();
-    o.topicIds = buildUnnamed630();
+    o.relevantTopicIds = buildUnnamed627();
+    o.topicCategories = buildUnnamed628();
+    o.topicIds = buildUnnamed629();
   }
   buildCounterVideoTopicDetails--;
   return o;
@@ -5803,9 +5847,9 @@
 checkVideoTopicDetails(api.VideoTopicDetails o) {
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    checkUnnamed628(o.relevantTopicIds);
-    checkUnnamed629(o.topicCategories);
-    checkUnnamed630(o.topicIds);
+    checkUnnamed627(o.relevantTopicIds);
+    checkUnnamed628(o.topicCategories);
+    checkUnnamed629(o.topicIds);
   }
   buildCounterVideoTopicDetails--;
 }
@@ -5833,7 +5877,6 @@
   buildCounterWatchSettings--;
 }
 
-
 main() {
   unittest.group("obj-schema-AccessPolicy", () {
     unittest.test("to-json--from-json", () {
@@ -5843,7 +5886,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Activity", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivity();
@@ -5852,7 +5894,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetails();
@@ -5861,7 +5902,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsBulletin", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsBulletin();
@@ -5870,7 +5910,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsChannelItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsChannelItem();
@@ -5879,7 +5918,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsComment", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsComment();
@@ -5888,7 +5926,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsFavorite", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsFavorite();
@@ -5897,7 +5934,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsLike", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsLike();
@@ -5906,7 +5942,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsPlaylistItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsPlaylistItem();
@@ -5915,7 +5950,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsPromotedItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsPromotedItem();
@@ -5924,16 +5958,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsRecommendation", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsRecommendation();
-      var od = new api.ActivityContentDetailsRecommendation.fromJson(o.toJson());
+      var od =
+          new api.ActivityContentDetailsRecommendation.fromJson(o.toJson());
       checkActivityContentDetailsRecommendation(od);
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsSocial", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsSocial();
@@ -5942,7 +5975,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsSubscription", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsSubscription();
@@ -5951,7 +5983,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityContentDetailsUpload", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityContentDetailsUpload();
@@ -5960,7 +5991,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivityListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivityListResponse();
@@ -5969,7 +5999,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ActivitySnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildActivitySnippet();
@@ -5978,7 +6007,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Caption", () {
     unittest.test("to-json--from-json", () {
       var o = buildCaption();
@@ -5987,7 +6015,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CaptionListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCaptionListResponse();
@@ -5996,7 +6023,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CaptionSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildCaptionSnippet();
@@ -6005,7 +6031,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CdnSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildCdnSettings();
@@ -6014,7 +6039,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Channel", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannel();
@@ -6023,7 +6047,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelAuditDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelAuditDetails();
@@ -6032,7 +6055,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelBannerResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelBannerResource();
@@ -6041,7 +6063,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelBrandingSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelBrandingSettings();
@@ -6050,16 +6071,15 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelContentDetailsRelatedPlaylists", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelContentDetailsRelatedPlaylists();
-      var od = new api.ChannelContentDetailsRelatedPlaylists.fromJson(o.toJson());
+      var od =
+          new api.ChannelContentDetailsRelatedPlaylists.fromJson(o.toJson());
       checkChannelContentDetailsRelatedPlaylists(od);
     });
   });
 
-
   unittest.group("obj-schema-ChannelContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelContentDetails();
@@ -6068,7 +6088,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelContentOwnerDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelContentOwnerDetails();
@@ -6077,7 +6096,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelConversionPing", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelConversionPing();
@@ -6086,7 +6104,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelConversionPings", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelConversionPings();
@@ -6095,7 +6112,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelListResponse();
@@ -6104,7 +6120,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelLocalization", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelLocalization();
@@ -6113,7 +6128,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelProfileDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelProfileDetails();
@@ -6122,7 +6136,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSection", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSection();
@@ -6131,7 +6144,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSectionContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSectionContentDetails();
@@ -6140,7 +6152,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSectionListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSectionListResponse();
@@ -6149,7 +6160,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSectionLocalization", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSectionLocalization();
@@ -6158,7 +6168,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSectionSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSectionSnippet();
@@ -6167,7 +6176,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSectionTargeting", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSectionTargeting();
@@ -6176,7 +6184,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSettings();
@@ -6185,7 +6192,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelSnippet();
@@ -6194,7 +6200,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelStatistics", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelStatistics();
@@ -6203,7 +6208,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelStatus();
@@ -6212,7 +6216,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ChannelTopicDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildChannelTopicDetails();
@@ -6221,7 +6224,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Comment", () {
     unittest.test("to-json--from-json", () {
       var o = buildComment();
@@ -6230,7 +6232,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentListResponse();
@@ -6239,7 +6240,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentSnippet();
@@ -6248,7 +6248,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentThread", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentThread();
@@ -6257,7 +6256,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentThreadListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentThreadListResponse();
@@ -6266,7 +6264,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentThreadReplies", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentThreadReplies();
@@ -6275,7 +6272,6 @@
     });
   });
 
-
   unittest.group("obj-schema-CommentThreadSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildCommentThreadSnippet();
@@ -6284,7 +6280,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ContentRating", () {
     unittest.test("to-json--from-json", () {
       var o = buildContentRating();
@@ -6293,7 +6288,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FanFundingEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildFanFundingEvent();
@@ -6302,7 +6296,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FanFundingEventListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildFanFundingEventListResponse();
@@ -6311,7 +6304,6 @@
     });
   });
 
-
   unittest.group("obj-schema-FanFundingEventSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildFanFundingEventSnippet();
@@ -6320,7 +6312,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GeoPoint", () {
     unittest.test("to-json--from-json", () {
       var o = buildGeoPoint();
@@ -6329,7 +6320,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GuideCategory", () {
     unittest.test("to-json--from-json", () {
       var o = buildGuideCategory();
@@ -6338,7 +6328,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GuideCategoryListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGuideCategoryListResponse();
@@ -6347,7 +6336,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GuideCategorySnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildGuideCategorySnippet();
@@ -6356,7 +6344,6 @@
     });
   });
 
-
   unittest.group("obj-schema-I18nLanguage", () {
     unittest.test("to-json--from-json", () {
       var o = buildI18nLanguage();
@@ -6365,7 +6352,6 @@
     });
   });
 
-
   unittest.group("obj-schema-I18nLanguageListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildI18nLanguageListResponse();
@@ -6374,7 +6360,6 @@
     });
   });
 
-
   unittest.group("obj-schema-I18nLanguageSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildI18nLanguageSnippet();
@@ -6383,7 +6368,6 @@
     });
   });
 
-
   unittest.group("obj-schema-I18nRegion", () {
     unittest.test("to-json--from-json", () {
       var o = buildI18nRegion();
@@ -6392,7 +6376,6 @@
     });
   });
 
-
   unittest.group("obj-schema-I18nRegionListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildI18nRegionListResponse();
@@ -6401,7 +6384,6 @@
     });
   });
 
-
   unittest.group("obj-schema-I18nRegionSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildI18nRegionSnippet();
@@ -6410,7 +6392,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ImageSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildImageSettings();
@@ -6419,7 +6400,6 @@
     });
   });
 
-
   unittest.group("obj-schema-IngestionInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildIngestionInfo();
@@ -6428,7 +6408,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InvideoBranding", () {
     unittest.test("to-json--from-json", () {
       var o = buildInvideoBranding();
@@ -6437,7 +6416,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InvideoPosition", () {
     unittest.test("to-json--from-json", () {
       var o = buildInvideoPosition();
@@ -6446,7 +6424,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InvideoPromotion", () {
     unittest.test("to-json--from-json", () {
       var o = buildInvideoPromotion();
@@ -6455,7 +6432,6 @@
     });
   });
 
-
   unittest.group("obj-schema-InvideoTiming", () {
     unittest.test("to-json--from-json", () {
       var o = buildInvideoTiming();
@@ -6464,7 +6440,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LanguageTag", () {
     unittest.test("to-json--from-json", () {
       var o = buildLanguageTag();
@@ -6473,7 +6448,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcast", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcast();
@@ -6482,7 +6456,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastContentDetails();
@@ -6491,7 +6464,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastListResponse();
@@ -6500,7 +6472,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastSnippet();
@@ -6509,7 +6480,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastStatistics", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastStatistics();
@@ -6518,7 +6488,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastStatus();
@@ -6527,7 +6496,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastTopic", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastTopic();
@@ -6536,7 +6504,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastTopicDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastTopicDetails();
@@ -6545,7 +6512,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveBroadcastTopicSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveBroadcastTopicSnippet();
@@ -6554,7 +6520,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatBan", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatBan();
@@ -6563,7 +6528,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatBanSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatBanSnippet();
@@ -6572,7 +6536,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatFanFundingEventDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatFanFundingEventDetails();
@@ -6581,7 +6544,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatMessage", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatMessage();
@@ -6590,7 +6552,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatMessageAuthorDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatMessageAuthorDetails();
@@ -6599,7 +6560,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatMessageDeletedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatMessageDeletedDetails();
@@ -6608,7 +6568,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatMessageListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatMessageListResponse();
@@ -6617,7 +6576,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatMessageRetractedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatMessageRetractedDetails();
@@ -6626,7 +6584,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatMessageSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatMessageSnippet();
@@ -6635,7 +6592,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatModerator", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatModerator();
@@ -6644,7 +6600,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatModeratorListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatModeratorListResponse();
@@ -6653,7 +6608,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatModeratorSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatModeratorSnippet();
@@ -6662,7 +6616,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatPollClosedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatPollClosedDetails();
@@ -6671,7 +6624,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatPollEditedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatPollEditedDetails();
@@ -6680,7 +6632,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatPollItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatPollItem();
@@ -6689,7 +6640,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatPollOpenedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatPollOpenedDetails();
@@ -6698,7 +6648,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatPollVotedDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatPollVotedDetails();
@@ -6707,7 +6656,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatSuperChatDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatSuperChatDetails();
@@ -6716,7 +6664,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatTextMessageDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatTextMessageDetails();
@@ -6725,7 +6672,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveChatUserBannedMessageDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveChatUserBannedMessageDetails();
@@ -6734,7 +6680,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStream", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStream();
@@ -6743,7 +6688,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStreamConfigurationIssue", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStreamConfigurationIssue();
@@ -6752,7 +6696,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStreamContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStreamContentDetails();
@@ -6761,7 +6704,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStreamHealthStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStreamHealthStatus();
@@ -6770,7 +6712,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStreamListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStreamListResponse();
@@ -6779,7 +6720,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStreamSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStreamSnippet();
@@ -6788,7 +6728,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LiveStreamStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildLiveStreamStatus();
@@ -6797,7 +6736,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocalizedProperty", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocalizedProperty();
@@ -6806,7 +6744,6 @@
     });
   });
 
-
   unittest.group("obj-schema-LocalizedString", () {
     unittest.test("to-json--from-json", () {
       var o = buildLocalizedString();
@@ -6815,7 +6752,6 @@
     });
   });
 
-
   unittest.group("obj-schema-MonitorStreamInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildMonitorStreamInfo();
@@ -6824,7 +6760,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PageInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageInfo();
@@ -6833,7 +6768,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Playlist", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylist();
@@ -6842,7 +6776,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistContentDetails();
@@ -6851,7 +6784,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistItem();
@@ -6860,7 +6792,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistItemContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistItemContentDetails();
@@ -6869,7 +6800,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistItemListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistItemListResponse();
@@ -6878,7 +6808,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistItemSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistItemSnippet();
@@ -6887,7 +6816,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistItemStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistItemStatus();
@@ -6896,7 +6824,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistListResponse();
@@ -6905,7 +6832,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistLocalization", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistLocalization();
@@ -6914,7 +6840,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistPlayer", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistPlayer();
@@ -6923,7 +6848,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistSnippet();
@@ -6932,7 +6856,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PlaylistStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlaylistStatus();
@@ -6941,7 +6864,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PromotedItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildPromotedItem();
@@ -6950,7 +6872,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PromotedItemId", () {
     unittest.test("to-json--from-json", () {
       var o = buildPromotedItemId();
@@ -6959,7 +6880,6 @@
     });
   });
 
-
   unittest.group("obj-schema-PropertyValue", () {
     unittest.test("to-json--from-json", () {
       var o = buildPropertyValue();
@@ -6968,7 +6888,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResourceId", () {
     unittest.test("to-json--from-json", () {
       var o = buildResourceId();
@@ -6977,7 +6896,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchListResponse();
@@ -6986,7 +6904,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchResult", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchResult();
@@ -6995,7 +6912,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SearchResultSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchResultSnippet();
@@ -7004,7 +6920,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Sponsor", () {
     unittest.test("to-json--from-json", () {
       var o = buildSponsor();
@@ -7013,7 +6928,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SponsorListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSponsorListResponse();
@@ -7022,7 +6936,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SponsorSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildSponsorSnippet();
@@ -7031,7 +6944,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Subscription", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscription();
@@ -7040,7 +6952,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionContentDetails();
@@ -7049,7 +6960,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionListResponse();
@@ -7058,7 +6968,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionSnippet();
@@ -7067,7 +6976,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SubscriptionSubscriberSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionSubscriberSnippet();
@@ -7076,7 +6984,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SuperChatEvent", () {
     unittest.test("to-json--from-json", () {
       var o = buildSuperChatEvent();
@@ -7085,7 +6992,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SuperChatEventListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildSuperChatEventListResponse();
@@ -7094,7 +7000,6 @@
     });
   });
 
-
   unittest.group("obj-schema-SuperChatEventSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildSuperChatEventSnippet();
@@ -7103,7 +7008,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Thumbnail", () {
     unittest.test("to-json--from-json", () {
       var o = buildThumbnail();
@@ -7112,7 +7016,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThumbnailDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildThumbnailDetails();
@@ -7121,7 +7024,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ThumbnailSetResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildThumbnailSetResponse();
@@ -7130,7 +7032,6 @@
     });
   });
 
-
   unittest.group("obj-schema-TokenPagination", () {
     unittest.test("to-json--from-json", () {
       var o = buildTokenPagination();
@@ -7139,7 +7040,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Video", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideo();
@@ -7148,7 +7048,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoAbuseReport", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoAbuseReport();
@@ -7157,7 +7056,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoAbuseReportReason", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoAbuseReportReason();
@@ -7166,7 +7064,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoAbuseReportReasonListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoAbuseReportReasonListResponse();
@@ -7175,7 +7072,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoAbuseReportReasonSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoAbuseReportReasonSnippet();
@@ -7184,7 +7080,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoAbuseReportSecondaryReason", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoAbuseReportSecondaryReason();
@@ -7193,7 +7088,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoAgeGating", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoAgeGating();
@@ -7202,7 +7096,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoCategory", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoCategory();
@@ -7211,7 +7104,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoCategoryListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoCategoryListResponse();
@@ -7220,7 +7112,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoCategorySnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoCategorySnippet();
@@ -7229,7 +7120,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoContentDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoContentDetails();
@@ -7238,16 +7128,15 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoContentDetailsRegionRestriction", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoContentDetailsRegionRestriction();
-      var od = new api.VideoContentDetailsRegionRestriction.fromJson(o.toJson());
+      var od =
+          new api.VideoContentDetailsRegionRestriction.fromJson(o.toJson());
       checkVideoContentDetailsRegionRestriction(od);
     });
   });
 
-
   unittest.group("obj-schema-VideoFileDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoFileDetails();
@@ -7256,7 +7145,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoFileDetailsAudioStream", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoFileDetailsAudioStream();
@@ -7265,7 +7153,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoFileDetailsVideoStream", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoFileDetailsVideoStream();
@@ -7274,7 +7161,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoGetRatingResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoGetRatingResponse();
@@ -7283,7 +7169,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoListResponse();
@@ -7292,7 +7177,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoLiveStreamingDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoLiveStreamingDetails();
@@ -7301,7 +7185,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoLocalization", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoLocalization();
@@ -7310,7 +7193,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoMonetizationDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoMonetizationDetails();
@@ -7319,7 +7201,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoPlayer", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoPlayer();
@@ -7328,7 +7209,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoProcessingDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoProcessingDetails();
@@ -7337,16 +7217,15 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoProcessingDetailsProcessingProgress", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoProcessingDetailsProcessingProgress();
-      var od = new api.VideoProcessingDetailsProcessingProgress.fromJson(o.toJson());
+      var od =
+          new api.VideoProcessingDetailsProcessingProgress.fromJson(o.toJson());
       checkVideoProcessingDetailsProcessingProgress(od);
     });
   });
 
-
   unittest.group("obj-schema-VideoProjectDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoProjectDetails();
@@ -7355,7 +7234,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoRating", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoRating();
@@ -7364,7 +7242,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoRecordingDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoRecordingDetails();
@@ -7373,7 +7250,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoSnippet();
@@ -7382,7 +7258,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoStatistics", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoStatistics();
@@ -7391,7 +7266,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoStatus();
@@ -7400,7 +7274,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoSuggestions", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoSuggestions();
@@ -7409,7 +7282,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoSuggestionsTagSuggestion", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoSuggestionsTagSuggestion();
@@ -7418,7 +7290,6 @@
     });
   });
 
-
   unittest.group("obj-schema-VideoTopicDetails", () {
     unittest.test("to-json--from-json", () {
       var o = buildVideoTopicDetails();
@@ -7427,7 +7298,6 @@
     });
   });
 
-
   unittest.group("obj-schema-WatchSettings", () {
     unittest.test("to-json--from-json", () {
       var o = buildWatchSettings();
@@ -7436,10 +7306,8 @@
     });
   });
 
-
   unittest.group("resource-ActivitiesResourceApi", () {
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.YoutubeApi(mock).activities;
       var arg_request = buildActivity();
@@ -7452,11 +7320,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("activities"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -7469,28 +7340,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildActivity());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.Activity response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.Activity response) {
         checkActivity(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ActivitiesResourceApi res = new api.YoutubeApi(mock).activities;
       var arg_part = "foo";
@@ -7507,11 +7380,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("activities"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -7524,40 +7400,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
         unittest.expect(queryMap["home"].first, unittest.equals("$arg_home"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.DateTime.parse(queryMap["publishedAfter"].first), unittest.equals(arg_publishedAfter));
-        unittest.expect(core.DateTime.parse(queryMap["publishedBefore"].first), unittest.equals(arg_publishedBefore));
-        unittest.expect(queryMap["regionCode"].first, unittest.equals(arg_regionCode));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.DateTime.parse(queryMap["publishedAfter"].first),
+            unittest.equals(arg_publishedAfter));
+        unittest.expect(core.DateTime.parse(queryMap["publishedBefore"].first),
+            unittest.equals(arg_publishedBefore));
+        unittest.expect(
+            queryMap["regionCode"].first, unittest.equals(arg_regionCode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildActivityListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, channelId: arg_channelId, home: arg_home, maxResults: arg_maxResults, mine: arg_mine, pageToken: arg_pageToken, publishedAfter: arg_publishedAfter, publishedBefore: arg_publishedBefore, regionCode: arg_regionCode).then(unittest.expectAsync1(((api.ActivityListResponse response) {
+      res
+          .list(arg_part,
+              channelId: arg_channelId,
+              home: arg_home,
+              maxResults: arg_maxResults,
+              mine: arg_mine,
+              pageToken: arg_pageToken,
+              publishedAfter: arg_publishedAfter,
+              publishedBefore: arg_publishedBefore,
+              regionCode: arg_regionCode)
+          .then(unittest.expectAsync1(((api.ActivityListResponse response) {
         checkActivityListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CaptionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.CaptionsResourceApi res = new api.YoutubeApi(mock).captions;
       var arg_id = "foo";
@@ -7568,11 +7458,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("captions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("captions"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7585,24 +7478,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(
+            queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOf: arg_onBehalfOf, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id,
+              onBehalfOf: arg_onBehalfOf,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--download", () {
@@ -7621,11 +7521,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("captions/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("captions/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -7641,25 +7544,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["tfmt"].first, unittest.equals(arg_tfmt));
         unittest.expect(queryMap["tlang"].first, unittest.equals(arg_tlang));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.download(arg_id, onBehalfOf: arg_onBehalfOf, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, tfmt: arg_tfmt, tlang: arg_tlang).then(unittest.expectAsync1((_) {}));
+      res
+          .download(arg_id,
+              onBehalfOf: arg_onBehalfOf,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              tfmt: arg_tfmt,
+              tlang: arg_tlang)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
@@ -7681,11 +7593,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("captions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("captions"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7698,31 +7613,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["sync"].first, unittest.equals("$arg_sync"));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCaption());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, onBehalfOf: arg_onBehalfOf, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, sync: arg_sync).then(unittest.expectAsync1(((api.Caption response) {
+      res
+          .insert(arg_request, arg_part,
+              onBehalfOf: arg_onBehalfOf,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              sync: arg_sync)
+          .then(unittest.expectAsync1(((api.Caption response) {
         checkCaption(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.CaptionsResourceApi res = new api.YoutubeApi(mock).captions;
       var arg_part = "foo";
@@ -7735,11 +7657,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("captions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("captions"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7752,26 +7677,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["videoId"].first, unittest.equals(arg_videoId));
+        unittest.expect(
+            queryMap["videoId"].first, unittest.equals(arg_videoId));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(
+            queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCaptionListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, arg_videoId, id: arg_id, onBehalfOf: arg_onBehalfOf, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.CaptionListResponse response) {
+      res
+          .list(arg_part, arg_videoId,
+              id: arg_id,
+              onBehalfOf: arg_onBehalfOf,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.CaptionListResponse response) {
         checkCaptionListResponse(response);
       })));
     });
@@ -7795,11 +7729,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("captions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("captions"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -7812,39 +7749,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["onBehalfOf"].first, unittest.equals(arg_onBehalfOf));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["sync"].first, unittest.equals("$arg_sync"));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCaption());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOf: arg_onBehalfOf, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, sync: arg_sync).then(unittest.expectAsync1(((api.Caption response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOf: arg_onBehalfOf,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              sync: arg_sync)
+          .then(unittest.expectAsync1(((api.Caption response) {
         checkCaption(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelBannersResourceApi", () {
     unittest.test("method--insert", () {
       // TODO: Implement tests for media upload;
       // TODO: Implement tests for media download;
 
       var mock = new HttpServerMock();
-      api.ChannelBannersResourceApi res = new api.YoutubeApi(mock).channelBanners;
+      api.ChannelBannersResourceApi res =
+          new api.YoutubeApi(mock).channelBanners;
       var arg_request = buildChannelBannerResource();
       var arg_onBehalfOfContentOwner = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -7855,11 +7799,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("channelBanners/insert"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("channelBanners/insert"));
         pathOffset += 21;
 
         var query = (req.url).query;
@@ -7872,34 +7819,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannelBannerResource());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.ChannelBannerResource response) {
+      res
+          .insert(arg_request,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.ChannelBannerResource response) {
         checkChannelBannerResource(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelSectionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.ChannelSectionsResourceApi res = new api.YoutubeApi(mock).channelSections;
+      api.ChannelSectionsResourceApi res =
+          new api.YoutubeApi(mock).channelSections;
       var arg_id = "foo";
       var arg_onBehalfOfContentOwner = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -7907,11 +7857,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("channelSections"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -7924,29 +7877,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.ChannelSectionsResourceApi res = new api.YoutubeApi(mock).channelSections;
+      api.ChannelSectionsResourceApi res =
+          new api.YoutubeApi(mock).channelSections;
       var arg_request = buildChannelSection();
       var arg_part = "foo";
       var arg_onBehalfOfContentOwner = "foo";
@@ -7959,11 +7916,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("channelSections"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -7976,32 +7936,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannelSection());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.ChannelSection response) {
+      res
+          .insert(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.ChannelSection response) {
         checkChannelSection(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ChannelSectionsResourceApi res = new api.YoutubeApi(mock).channelSections;
+      api.ChannelSectionsResourceApi res =
+          new api.YoutubeApi(mock).channelSections;
       var arg_part = "foo";
       var arg_channelId = "foo";
       var arg_hl = "foo";
@@ -8013,11 +7980,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("channelSections"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -8030,35 +8000,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannelSectionListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, channelId: arg_channelId, hl: arg_hl, id: arg_id, mine: arg_mine, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.ChannelSectionListResponse response) {
+      res
+          .list(arg_part,
+              channelId: arg_channelId,
+              hl: arg_hl,
+              id: arg_id,
+              mine: arg_mine,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(
+              unittest.expectAsync1(((api.ChannelSectionListResponse response) {
         checkChannelSectionListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.ChannelSectionsResourceApi res = new api.YoutubeApi(mock).channelSections;
+      api.ChannelSectionsResourceApi res =
+          new api.YoutubeApi(mock).channelSections;
       var arg_request = buildChannelSection();
       var arg_part = "foo";
       var arg_onBehalfOfContentOwner = "foo";
@@ -8070,11 +8051,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("channelSections"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -8087,33 +8071,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannelSection());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.ChannelSection response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.ChannelSection response) {
         checkChannelSection(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ChannelsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.ChannelsResourceApi res = new api.YoutubeApi(mock).channels;
       var arg_part = "foo";
@@ -8132,11 +8118,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("channels"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("channels"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8149,38 +8138,57 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["categoryId"].first, unittest.equals(arg_categoryId));
-        unittest.expect(queryMap["forUsername"].first, unittest.equals(arg_forUsername));
+        unittest.expect(
+            queryMap["categoryId"].first, unittest.equals(arg_categoryId));
+        unittest.expect(
+            queryMap["forUsername"].first, unittest.equals(arg_forUsername));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["managedByMe"].first, unittest.equals("$arg_managedByMe"));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["managedByMe"].first, unittest.equals("$arg_managedByMe"));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["mySubscribers"].first, unittest.equals("$arg_mySubscribers"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["mySubscribers"].first,
+            unittest.equals("$arg_mySubscribers"));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannelListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, categoryId: arg_categoryId, forUsername: arg_forUsername, hl: arg_hl, id: arg_id, managedByMe: arg_managedByMe, maxResults: arg_maxResults, mine: arg_mine, mySubscribers: arg_mySubscribers, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.ChannelListResponse response) {
+      res
+          .list(arg_part,
+              categoryId: arg_categoryId,
+              forUsername: arg_forUsername,
+              hl: arg_hl,
+              id: arg_id,
+              managedByMe: arg_managedByMe,
+              maxResults: arg_maxResults,
+              mine: arg_mine,
+              mySubscribers: arg_mySubscribers,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.ChannelListResponse response) {
         checkChannelListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.ChannelsResourceApi res = new api.YoutubeApi(mock).channels;
       var arg_request = buildChannel();
@@ -8194,11 +8202,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("channels"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("channels"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8211,35 +8222,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Channel response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Channel response) {
         checkChannel(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CommentThreadsResourceApi", () {
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.CommentThreadsResourceApi res = new api.YoutubeApi(mock).commentThreads;
+      api.CommentThreadsResourceApi res =
+          new api.YoutubeApi(mock).commentThreads;
       var arg_request = buildCommentThread();
       var arg_part = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -8250,11 +8264,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("commentThreads"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("commentThreads"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -8267,30 +8284,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentThread());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.CommentThread response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.CommentThread response) {
         checkCommentThread(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.CommentThreadsResourceApi res = new api.YoutubeApi(mock).commentThreads;
+      api.CommentThreadsResourceApi res =
+          new api.YoutubeApi(mock).commentThreads;
       var arg_part = "foo";
       var arg_allThreadsRelatedToChannelId = "foo";
       var arg_channelId = "foo";
@@ -8307,11 +8327,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("commentThreads"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("commentThreads"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -8324,40 +8347,62 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["allThreadsRelatedToChannelId"].first, unittest.equals(arg_allThreadsRelatedToChannelId));
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(queryMap["allThreadsRelatedToChannelId"].first,
+            unittest.equals(arg_allThreadsRelatedToChannelId));
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["moderationStatus"].first, unittest.equals(arg_moderationStatus));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(queryMap["moderationStatus"].first,
+            unittest.equals(arg_moderationStatus));
         unittest.expect(queryMap["order"].first, unittest.equals(arg_order));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["searchTerms"].first, unittest.equals(arg_searchTerms));
-        unittest.expect(queryMap["textFormat"].first, unittest.equals(arg_textFormat));
-        unittest.expect(queryMap["videoId"].first, unittest.equals(arg_videoId));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["searchTerms"].first, unittest.equals(arg_searchTerms));
+        unittest.expect(
+            queryMap["textFormat"].first, unittest.equals(arg_textFormat));
+        unittest.expect(
+            queryMap["videoId"].first, unittest.equals(arg_videoId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentThreadListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, allThreadsRelatedToChannelId: arg_allThreadsRelatedToChannelId, channelId: arg_channelId, id: arg_id, maxResults: arg_maxResults, moderationStatus: arg_moderationStatus, order: arg_order, pageToken: arg_pageToken, searchTerms: arg_searchTerms, textFormat: arg_textFormat, videoId: arg_videoId).then(unittest.expectAsync1(((api.CommentThreadListResponse response) {
+      res
+          .list(arg_part,
+              allThreadsRelatedToChannelId: arg_allThreadsRelatedToChannelId,
+              channelId: arg_channelId,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              moderationStatus: arg_moderationStatus,
+              order: arg_order,
+              pageToken: arg_pageToken,
+              searchTerms: arg_searchTerms,
+              textFormat: arg_textFormat,
+              videoId: arg_videoId)
+          .then(
+              unittest.expectAsync1(((api.CommentThreadListResponse response) {
         checkCommentThreadListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.CommentThreadsResourceApi res = new api.YoutubeApi(mock).commentThreads;
+      api.CommentThreadsResourceApi res =
+          new api.YoutubeApi(mock).commentThreads;
       var arg_request = buildCommentThread();
       var arg_part = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -8368,11 +8413,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("commentThreads"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("commentThreads"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -8385,32 +8433,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentThread());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part).then(unittest.expectAsync1(((api.CommentThread response) {
+      res
+          .update(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.CommentThread response) {
         checkCommentThread(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-CommentsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.YoutubeApi(mock).comments;
       var arg_id = "foo";
@@ -8419,11 +8467,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("comments"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8436,17 +8487,18 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -8455,7 +8507,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.YoutubeApi(mock).comments;
       var arg_request = buildComment();
@@ -8468,11 +8519,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("comments"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8485,28 +8539,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.YoutubeApi(mock).comments;
       var arg_part = "foo";
@@ -8520,11 +8576,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("comments"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8537,33 +8596,44 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["parentId"].first, unittest.equals(arg_parentId));
-        unittest.expect(queryMap["textFormat"].first, unittest.equals(arg_textFormat));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["parentId"].first, unittest.equals(arg_parentId));
+        unittest.expect(
+            queryMap["textFormat"].first, unittest.equals(arg_textFormat));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildCommentListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, id: arg_id, maxResults: arg_maxResults, pageToken: arg_pageToken, parentId: arg_parentId, textFormat: arg_textFormat).then(unittest.expectAsync1(((api.CommentListResponse response) {
+      res
+          .list(arg_part,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              parentId: arg_parentId,
+              textFormat: arg_textFormat)
+          .then(unittest.expectAsync1(((api.CommentListResponse response) {
         checkCommentListResponse(response);
       })));
     });
 
     unittest.test("method--markAsSpam", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.YoutubeApi(mock).comments;
       var arg_id = "foo";
@@ -8572,11 +8642,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("comments/markAsSpam"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("comments/markAsSpam"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -8589,17 +8662,18 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -8608,7 +8682,6 @@
     });
 
     unittest.test("method--setModerationStatus", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.YoutubeApi(mock).comments;
       var arg_id = "foo";
@@ -8619,11 +8692,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("comments/setModerationStatus"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 28),
+            unittest.equals("comments/setModerationStatus"));
         pathOffset += 28;
 
         var query = (req.url).query;
@@ -8636,28 +8712,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["moderationStatus"].first, unittest.equals(arg_moderationStatus));
-        unittest.expect(queryMap["banAuthor"].first, unittest.equals("$arg_banAuthor"));
-
+        unittest.expect(queryMap["moderationStatus"].first,
+            unittest.equals(arg_moderationStatus));
+        unittest.expect(
+            queryMap["banAuthor"].first, unittest.equals("$arg_banAuthor"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.setModerationStatus(arg_id, arg_moderationStatus, banAuthor: arg_banAuthor).then(unittest.expectAsync1((_) {}));
+      res
+          .setModerationStatus(arg_id, arg_moderationStatus,
+              banAuthor: arg_banAuthor)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.CommentsResourceApi res = new api.YoutubeApi(mock).comments;
       var arg_request = buildComment();
@@ -8670,11 +8751,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("comments"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("comments"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -8687,34 +8771,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildComment());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part).then(unittest.expectAsync1(((api.Comment response) {
+      res
+          .update(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.Comment response) {
         checkComment(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-FanFundingEventsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.FanFundingEventsResourceApi res = new api.YoutubeApi(mock).fanFundingEvents;
+      api.FanFundingEventsResourceApi res =
+          new api.YoutubeApi(mock).fanFundingEvents;
       var arg_part = "foo";
       var arg_hl = "foo";
       var arg_maxResults = 42;
@@ -8724,11 +8809,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fanFundingEvents"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("fanFundingEvents"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -8741,37 +8829,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildFanFundingEventListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.FanFundingEventListResponse response) {
+      res
+          .list(arg_part,
+              hl: arg_hl, maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.FanFundingEventListResponse response) {
         checkFanFundingEventListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GuideCategoriesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GuideCategoriesResourceApi res = new api.YoutubeApi(mock).guideCategories;
+      api.GuideCategoriesResourceApi res =
+          new api.YoutubeApi(mock).guideCategories;
       var arg_part = "foo";
       var arg_hl = "foo";
       var arg_id = "foo";
@@ -8781,11 +8874,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("guideCategories"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("guideCategories"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -8798,35 +8894,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["regionCode"].first, unittest.equals(arg_regionCode));
-
+        unittest.expect(
+            queryMap["regionCode"].first, unittest.equals(arg_regionCode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGuideCategoryListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl, id: arg_id, regionCode: arg_regionCode).then(unittest.expectAsync1(((api.GuideCategoryListResponse response) {
+      res
+          .list(arg_part, hl: arg_hl, id: arg_id, regionCode: arg_regionCode)
+          .then(
+              unittest.expectAsync1(((api.GuideCategoryListResponse response) {
         checkGuideCategoryListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-I18nLanguagesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.I18nLanguagesResourceApi res = new api.YoutubeApi(mock).i18nLanguages;
       var arg_part = "foo";
@@ -8836,11 +8934,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("i18nLanguages"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("i18nLanguages"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -8853,33 +8954,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildI18nLanguageListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl).then(unittest.expectAsync1(((api.I18nLanguageListResponse response) {
+      res
+          .list(arg_part, hl: arg_hl)
+          .then(unittest.expectAsync1(((api.I18nLanguageListResponse response) {
         checkI18nLanguageListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-I18nRegionsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.I18nRegionsResourceApi res = new api.YoutubeApi(mock).i18nRegions;
       var arg_part = "foo";
@@ -8889,11 +8990,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("i18nRegions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("i18nRegions"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -8906,35 +9010,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildI18nRegionListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl).then(unittest.expectAsync1(((api.I18nRegionListResponse response) {
+      res
+          .list(arg_part, hl: arg_hl)
+          .then(unittest.expectAsync1(((api.I18nRegionListResponse response) {
         checkI18nRegionListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LiveBroadcastsResourceApi", () {
     unittest.test("method--bind", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_id = "foo";
       var arg_part = "foo";
       var arg_onBehalfOfContentOwner = "foo";
@@ -8945,11 +9050,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("liveBroadcasts/bind"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("liveBroadcasts/bind"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -8962,34 +9070,43 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-        unittest.expect(queryMap["streamId"].first, unittest.equals(arg_streamId));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(
+            queryMap["streamId"].first, unittest.equals(arg_streamId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveBroadcast());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.bind(arg_id, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, streamId: arg_streamId).then(unittest.expectAsync1(((api.LiveBroadcast response) {
+      res
+          .bind(arg_id, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              streamId: arg_streamId)
+          .then(unittest.expectAsync1(((api.LiveBroadcast response) {
         checkLiveBroadcast(response);
       })));
     });
 
     unittest.test("method--control", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_id = "foo";
       var arg_part = "foo";
       var arg_displaySlate = true;
@@ -9002,11 +9119,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("liveBroadcasts/control"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 22),
+            unittest.equals("liveBroadcasts/control"));
         pathOffset += 22;
 
         var query = (req.url).query;
@@ -9019,36 +9139,49 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["displaySlate"].first, unittest.equals("$arg_displaySlate"));
-        unittest.expect(queryMap["offsetTimeMs"].first, unittest.equals(arg_offsetTimeMs));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-        unittest.expect(core.DateTime.parse(queryMap["walltime"].first), unittest.equals(arg_walltime));
-
+        unittest.expect(queryMap["displaySlate"].first,
+            unittest.equals("$arg_displaySlate"));
+        unittest.expect(
+            queryMap["offsetTimeMs"].first, unittest.equals(arg_offsetTimeMs));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(core.DateTime.parse(queryMap["walltime"].first),
+            unittest.equals(arg_walltime));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveBroadcast());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.control(arg_id, arg_part, displaySlate: arg_displaySlate, offsetTimeMs: arg_offsetTimeMs, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, walltime: arg_walltime).then(unittest.expectAsync1(((api.LiveBroadcast response) {
+      res
+          .control(arg_id, arg_part,
+              displaySlate: arg_displaySlate,
+              offsetTimeMs: arg_offsetTimeMs,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              walltime: arg_walltime)
+          .then(unittest.expectAsync1(((api.LiveBroadcast response) {
         checkLiveBroadcast(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_id = "foo";
       var arg_onBehalfOfContentOwner = "foo";
       var arg_onBehalfOfContentOwnerChannel = "foo";
@@ -9057,11 +9190,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -9074,30 +9210,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_request = buildLiveBroadcast();
       var arg_part = "foo";
       var arg_onBehalfOfContentOwner = "foo";
@@ -9110,11 +9253,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -9127,32 +9273,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveBroadcast());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.LiveBroadcast response) {
+      res
+          .insert(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.LiveBroadcast response) {
         checkLiveBroadcast(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_part = "foo";
       var arg_broadcastStatus = "foo";
       var arg_broadcastType = "foo";
@@ -9167,11 +9320,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -9184,38 +9340,56 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["broadcastStatus"].first, unittest.equals(arg_broadcastStatus));
-        unittest.expect(queryMap["broadcastType"].first, unittest.equals(arg_broadcastType));
+        unittest.expect(queryMap["broadcastStatus"].first,
+            unittest.equals(arg_broadcastStatus));
+        unittest.expect(queryMap["broadcastType"].first,
+            unittest.equals(arg_broadcastType));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveBroadcastListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, broadcastStatus: arg_broadcastStatus, broadcastType: arg_broadcastType, id: arg_id, maxResults: arg_maxResults, mine: arg_mine, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LiveBroadcastListResponse response) {
+      res
+          .list(arg_part,
+              broadcastStatus: arg_broadcastStatus,
+              broadcastType: arg_broadcastType,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              mine: arg_mine,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              pageToken: arg_pageToken)
+          .then(
+              unittest.expectAsync1(((api.LiveBroadcastListResponse response) {
         checkLiveBroadcastListResponse(response);
       })));
     });
 
     unittest.test("method--transition", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_broadcastStatus = "foo";
       var arg_id = "foo";
       var arg_part = "foo";
@@ -9226,11 +9400,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("liveBroadcasts/transition"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 25),
+            unittest.equals("liveBroadcasts/transition"));
         pathOffset += 25;
 
         var query = (req.url).query;
@@ -9243,34 +9420,42 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["broadcastStatus"].first, unittest.equals(arg_broadcastStatus));
+        unittest.expect(queryMap["broadcastStatus"].first,
+            unittest.equals(arg_broadcastStatus));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveBroadcast());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.transition(arg_broadcastStatus, arg_id, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.LiveBroadcast response) {
+      res
+          .transition(arg_broadcastStatus, arg_id, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.LiveBroadcast response) {
         checkLiveBroadcast(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
-      api.LiveBroadcastsResourceApi res = new api.YoutubeApi(mock).liveBroadcasts;
+      api.LiveBroadcastsResourceApi res =
+          new api.YoutubeApi(mock).liveBroadcasts;
       var arg_request = buildLiveBroadcast();
       var arg_part = "foo";
       var arg_onBehalfOfContentOwner = "foo";
@@ -9283,11 +9468,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -9300,34 +9488,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveBroadcast());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.LiveBroadcast response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.LiveBroadcast response) {
         checkLiveBroadcast(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LiveChatBansResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.LiveChatBansResourceApi res = new api.YoutubeApi(mock).liveChatBans;
       var arg_id = "foo";
@@ -9336,11 +9528,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("liveChat/bans"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("liveChat/bans"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -9353,17 +9548,18 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -9372,7 +9568,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.LiveChatBansResourceApi res = new api.YoutubeApi(mock).liveChatBans;
       var arg_request = buildLiveChatBan();
@@ -9385,11 +9580,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("liveChat/bans"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("liveChat/bans"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -9402,45 +9600,49 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveChatBan());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.LiveChatBan response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.LiveChatBan response) {
         checkLiveChatBan(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LiveChatMessagesResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.LiveChatMessagesResourceApi res = new api.YoutubeApi(mock).liveChatMessages;
+      api.LiveChatMessagesResourceApi res =
+          new api.YoutubeApi(mock).liveChatMessages;
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("liveChat/messages"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("liveChat/messages"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -9453,17 +9655,18 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -9472,9 +9675,9 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.LiveChatMessagesResourceApi res = new api.YoutubeApi(mock).liveChatMessages;
+      api.LiveChatMessagesResourceApi res =
+          new api.YoutubeApi(mock).liveChatMessages;
       var arg_request = buildLiveChatMessage();
       var arg_part = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -9485,11 +9688,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("liveChat/messages"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("liveChat/messages"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -9502,30 +9708,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveChatMessage());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.LiveChatMessage response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.LiveChatMessage response) {
         checkLiveChatMessage(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.LiveChatMessagesResourceApi res = new api.YoutubeApi(mock).liveChatMessages;
+      api.LiveChatMessagesResourceApi res =
+          new api.YoutubeApi(mock).liveChatMessages;
       var arg_liveChatId = "foo";
       var arg_part = "foo";
       var arg_hl = "foo";
@@ -9537,11 +9746,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("liveChat/messages"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 17),
+            unittest.equals("liveChat/messages"));
         pathOffset += 17;
 
         var query = (req.url).query;
@@ -9554,50 +9766,63 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["liveChatId"].first, unittest.equals(arg_liveChatId));
+        unittest.expect(
+            queryMap["liveChatId"].first, unittest.equals(arg_liveChatId));
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["profileImageSize"].first), unittest.equals(arg_profileImageSize));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["profileImageSize"].first),
+            unittest.equals(arg_profileImageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveChatMessageListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_liveChatId, arg_part, hl: arg_hl, maxResults: arg_maxResults, pageToken: arg_pageToken, profileImageSize: arg_profileImageSize).then(unittest.expectAsync1(((api.LiveChatMessageListResponse response) {
+      res
+          .list(arg_liveChatId, arg_part,
+              hl: arg_hl,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken,
+              profileImageSize: arg_profileImageSize)
+          .then(unittest
+              .expectAsync1(((api.LiveChatMessageListResponse response) {
         checkLiveChatMessageListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LiveChatModeratorsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.LiveChatModeratorsResourceApi res = new api.YoutubeApi(mock).liveChatModerators;
+      api.LiveChatModeratorsResourceApi res =
+          new api.YoutubeApi(mock).liveChatModerators;
       var arg_id = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("liveChat/moderators"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("liveChat/moderators"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -9610,17 +9835,18 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -9629,9 +9855,9 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.LiveChatModeratorsResourceApi res = new api.YoutubeApi(mock).liveChatModerators;
+      api.LiveChatModeratorsResourceApi res =
+          new api.YoutubeApi(mock).liveChatModerators;
       var arg_request = buildLiveChatModerator();
       var arg_part = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -9642,11 +9868,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("liveChat/moderators"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("liveChat/moderators"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -9659,30 +9888,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveChatModerator());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.LiveChatModerator response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.LiveChatModerator response) {
         checkLiveChatModerator(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.LiveChatModeratorsResourceApi res = new api.YoutubeApi(mock).liveChatModerators;
+      api.LiveChatModeratorsResourceApi res =
+          new api.YoutubeApi(mock).liveChatModerators;
       var arg_liveChatId = "foo";
       var arg_part = "foo";
       var arg_maxResults = 42;
@@ -9692,11 +9924,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("liveChat/moderators"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19),
+            unittest.equals("liveChat/moderators"));
         pathOffset += 19;
 
         var query = (req.url).query;
@@ -9709,35 +9944,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["liveChatId"].first, unittest.equals(arg_liveChatId));
+        unittest.expect(
+            queryMap["liveChatId"].first, unittest.equals(arg_liveChatId));
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveChatModeratorListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_liveChatId, arg_part, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LiveChatModeratorListResponse response) {
+      res
+          .list(arg_liveChatId, arg_part,
+              maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(unittest
+              .expectAsync1(((api.LiveChatModeratorListResponse response) {
         checkLiveChatModeratorListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-LiveStreamsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.LiveStreamsResourceApi res = new api.YoutubeApi(mock).liveStreams;
       var arg_id = "foo";
@@ -9748,11 +9988,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("liveStreams"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -9765,28 +10008,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.LiveStreamsResourceApi res = new api.YoutubeApi(mock).liveStreams;
       var arg_request = buildLiveStream();
@@ -9801,11 +10050,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("liveStreams"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -9818,30 +10070,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveStream());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.LiveStream response) {
+      res
+          .insert(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.LiveStream response) {
         checkLiveStream(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.LiveStreamsResourceApi res = new api.YoutubeApi(mock).liveStreams;
       var arg_part = "foo";
@@ -9856,11 +10114,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("liveStreams"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -9873,34 +10134,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveStreamListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, id: arg_id, maxResults: arg_maxResults, mine: arg_mine, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.LiveStreamListResponse response) {
+      res
+          .list(arg_part,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              mine: arg_mine,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.LiveStreamListResponse response) {
         checkLiveStreamListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.LiveStreamsResourceApi res = new api.YoutubeApi(mock).liveStreams;
       var arg_request = buildLiveStream();
@@ -9915,11 +10188,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("liveStreams"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -9932,34 +10208,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildLiveStream());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.LiveStream response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.LiveStream response) {
         checkLiveStream(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PlaylistItemsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.PlaylistItemsResourceApi res = new api.YoutubeApi(mock).playlistItems;
       var arg_id = "foo";
@@ -9969,11 +10249,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("playlistItems"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -9986,27 +10269,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.PlaylistItemsResourceApi res = new api.YoutubeApi(mock).playlistItems;
       var arg_request = buildPlaylistItem();
@@ -10020,11 +10306,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("playlistItems"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -10037,29 +10326,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlaylistItem());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.PlaylistItem response) {
+      res
+          .insert(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.PlaylistItem response) {
         checkPlaylistItem(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PlaylistItemsResourceApi res = new api.YoutubeApi(mock).playlistItems;
       var arg_part = "foo";
@@ -10074,11 +10367,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("playlistItems"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -10091,34 +10387,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["playlistId"].first, unittest.equals(arg_playlistId));
-        unittest.expect(queryMap["videoId"].first, unittest.equals(arg_videoId));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["playlistId"].first, unittest.equals(arg_playlistId));
+        unittest.expect(
+            queryMap["videoId"].first, unittest.equals(arg_videoId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlaylistItemListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, id: arg_id, maxResults: arg_maxResults, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, pageToken: arg_pageToken, playlistId: arg_playlistId, videoId: arg_videoId).then(unittest.expectAsync1(((api.PlaylistItemListResponse response) {
+      res
+          .list(arg_part,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              pageToken: arg_pageToken,
+              playlistId: arg_playlistId,
+              videoId: arg_videoId)
+          .then(unittest.expectAsync1(((api.PlaylistItemListResponse response) {
         checkPlaylistItemListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.PlaylistItemsResourceApi res = new api.YoutubeApi(mock).playlistItems;
       var arg_request = buildPlaylistItem();
@@ -10132,11 +10441,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("playlistItems"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -10149,33 +10461,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlaylistItem());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.PlaylistItem response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.PlaylistItem response) {
         checkPlaylistItem(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-PlaylistsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.PlaylistsResourceApi res = new api.YoutubeApi(mock).playlists;
       var arg_id = "foo";
@@ -10185,11 +10499,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("playlists"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -10202,27 +10519,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.PlaylistsResourceApi res = new api.YoutubeApi(mock).playlists;
       var arg_request = buildPlaylist();
@@ -10237,11 +10557,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("playlists"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -10254,30 +10577,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlaylist());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel).then(unittest.expectAsync1(((api.Playlist response) {
+      res
+          .insert(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel)
+          .then(unittest.expectAsync1(((api.Playlist response) {
         checkPlaylist(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.PlaylistsResourceApi res = new api.YoutubeApi(mock).playlists;
       var arg_part = "foo";
@@ -10294,11 +10623,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("playlists"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -10311,36 +10643,51 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlaylistListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, channelId: arg_channelId, hl: arg_hl, id: arg_id, maxResults: arg_maxResults, mine: arg_mine, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.PlaylistListResponse response) {
+      res
+          .list(arg_part,
+              channelId: arg_channelId,
+              hl: arg_hl,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              mine: arg_mine,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.PlaylistListResponse response) {
         checkPlaylistListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.PlaylistsResourceApi res = new api.YoutubeApi(mock).playlists;
       var arg_request = buildPlaylist();
@@ -10354,11 +10701,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("playlists"));
         pathOffset += 9;
 
         var query = (req.url).query;
@@ -10371,33 +10721,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildPlaylist());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Playlist response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Playlist response) {
         checkPlaylist(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SearchResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SearchResourceApi res = new api.YoutubeApi(mock).search;
       var arg_part = "foo";
@@ -10436,11 +10788,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("search"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("search"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -10453,62 +10808,119 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
-        unittest.expect(queryMap["channelType"].first, unittest.equals(arg_channelType));
-        unittest.expect(queryMap["eventType"].first, unittest.equals(arg_eventType));
-        unittest.expect(queryMap["forContentOwner"].first, unittest.equals("$arg_forContentOwner"));
-        unittest.expect(queryMap["forDeveloper"].first, unittest.equals("$arg_forDeveloper"));
-        unittest.expect(queryMap["forMine"].first, unittest.equals("$arg_forMine"));
-        unittest.expect(queryMap["location"].first, unittest.equals(arg_location));
-        unittest.expect(queryMap["locationRadius"].first, unittest.equals(arg_locationRadius));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(
+            queryMap["channelType"].first, unittest.equals(arg_channelType));
+        unittest.expect(
+            queryMap["eventType"].first, unittest.equals(arg_eventType));
+        unittest.expect(queryMap["forContentOwner"].first,
+            unittest.equals("$arg_forContentOwner"));
+        unittest.expect(queryMap["forDeveloper"].first,
+            unittest.equals("$arg_forDeveloper"));
+        unittest.expect(
+            queryMap["forMine"].first, unittest.equals("$arg_forMine"));
+        unittest.expect(
+            queryMap["location"].first, unittest.equals(arg_location));
+        unittest.expect(queryMap["locationRadius"].first,
+            unittest.equals(arg_locationRadius));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
         unittest.expect(queryMap["order"].first, unittest.equals(arg_order));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.DateTime.parse(queryMap["publishedAfter"].first), unittest.equals(arg_publishedAfter));
-        unittest.expect(core.DateTime.parse(queryMap["publishedBefore"].first), unittest.equals(arg_publishedBefore));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.DateTime.parse(queryMap["publishedAfter"].first),
+            unittest.equals(arg_publishedAfter));
+        unittest.expect(core.DateTime.parse(queryMap["publishedBefore"].first),
+            unittest.equals(arg_publishedBefore));
         unittest.expect(queryMap["q"].first, unittest.equals(arg_q));
-        unittest.expect(queryMap["regionCode"].first, unittest.equals(arg_regionCode));
-        unittest.expect(queryMap["relatedToVideoId"].first, unittest.equals(arg_relatedToVideoId));
-        unittest.expect(queryMap["relevanceLanguage"].first, unittest.equals(arg_relevanceLanguage));
-        unittest.expect(queryMap["safeSearch"].first, unittest.equals(arg_safeSearch));
-        unittest.expect(queryMap["topicId"].first, unittest.equals(arg_topicId));
+        unittest.expect(
+            queryMap["regionCode"].first, unittest.equals(arg_regionCode));
+        unittest.expect(queryMap["relatedToVideoId"].first,
+            unittest.equals(arg_relatedToVideoId));
+        unittest.expect(queryMap["relevanceLanguage"].first,
+            unittest.equals(arg_relevanceLanguage));
+        unittest.expect(
+            queryMap["safeSearch"].first, unittest.equals(arg_safeSearch));
+        unittest.expect(
+            queryMap["topicId"].first, unittest.equals(arg_topicId));
         unittest.expect(queryMap["type"].first, unittest.equals(arg_type));
-        unittest.expect(queryMap["videoCaption"].first, unittest.equals(arg_videoCaption));
-        unittest.expect(queryMap["videoCategoryId"].first, unittest.equals(arg_videoCategoryId));
-        unittest.expect(queryMap["videoDefinition"].first, unittest.equals(arg_videoDefinition));
-        unittest.expect(queryMap["videoDimension"].first, unittest.equals(arg_videoDimension));
-        unittest.expect(queryMap["videoDuration"].first, unittest.equals(arg_videoDuration));
-        unittest.expect(queryMap["videoEmbeddable"].first, unittest.equals(arg_videoEmbeddable));
-        unittest.expect(queryMap["videoLicense"].first, unittest.equals(arg_videoLicense));
-        unittest.expect(queryMap["videoSyndicated"].first, unittest.equals(arg_videoSyndicated));
-        unittest.expect(queryMap["videoType"].first, unittest.equals(arg_videoType));
-
+        unittest.expect(
+            queryMap["videoCaption"].first, unittest.equals(arg_videoCaption));
+        unittest.expect(queryMap["videoCategoryId"].first,
+            unittest.equals(arg_videoCategoryId));
+        unittest.expect(queryMap["videoDefinition"].first,
+            unittest.equals(arg_videoDefinition));
+        unittest.expect(queryMap["videoDimension"].first,
+            unittest.equals(arg_videoDimension));
+        unittest.expect(queryMap["videoDuration"].first,
+            unittest.equals(arg_videoDuration));
+        unittest.expect(queryMap["videoEmbeddable"].first,
+            unittest.equals(arg_videoEmbeddable));
+        unittest.expect(
+            queryMap["videoLicense"].first, unittest.equals(arg_videoLicense));
+        unittest.expect(queryMap["videoSyndicated"].first,
+            unittest.equals(arg_videoSyndicated));
+        unittest.expect(
+            queryMap["videoType"].first, unittest.equals(arg_videoType));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSearchListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, channelId: arg_channelId, channelType: arg_channelType, eventType: arg_eventType, forContentOwner: arg_forContentOwner, forDeveloper: arg_forDeveloper, forMine: arg_forMine, location: arg_location, locationRadius: arg_locationRadius, maxResults: arg_maxResults, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, order: arg_order, pageToken: arg_pageToken, publishedAfter: arg_publishedAfter, publishedBefore: arg_publishedBefore, q: arg_q, regionCode: arg_regionCode, relatedToVideoId: arg_relatedToVideoId, relevanceLanguage: arg_relevanceLanguage, safeSearch: arg_safeSearch, topicId: arg_topicId, type: arg_type, videoCaption: arg_videoCaption, videoCategoryId: arg_videoCategoryId, videoDefinition: arg_videoDefinition, videoDimension: arg_videoDimension, videoDuration: arg_videoDuration, videoEmbeddable: arg_videoEmbeddable, videoLicense: arg_videoLicense, videoSyndicated: arg_videoSyndicated, videoType: arg_videoType).then(unittest.expectAsync1(((api.SearchListResponse response) {
+      res
+          .list(arg_part,
+              channelId: arg_channelId,
+              channelType: arg_channelType,
+              eventType: arg_eventType,
+              forContentOwner: arg_forContentOwner,
+              forDeveloper: arg_forDeveloper,
+              forMine: arg_forMine,
+              location: arg_location,
+              locationRadius: arg_locationRadius,
+              maxResults: arg_maxResults,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              order: arg_order,
+              pageToken: arg_pageToken,
+              publishedAfter: arg_publishedAfter,
+              publishedBefore: arg_publishedBefore,
+              q: arg_q,
+              regionCode: arg_regionCode,
+              relatedToVideoId: arg_relatedToVideoId,
+              relevanceLanguage: arg_relevanceLanguage,
+              safeSearch: arg_safeSearch,
+              topicId: arg_topicId,
+              type: arg_type,
+              videoCaption: arg_videoCaption,
+              videoCategoryId: arg_videoCategoryId,
+              videoDefinition: arg_videoDefinition,
+              videoDimension: arg_videoDimension,
+              videoDuration: arg_videoDuration,
+              videoEmbeddable: arg_videoEmbeddable,
+              videoLicense: arg_videoLicense,
+              videoSyndicated: arg_videoSyndicated,
+              videoType: arg_videoType)
+          .then(unittest.expectAsync1(((api.SearchListResponse response) {
         checkSearchListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SponsorsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SponsorsResourceApi res = new api.YoutubeApi(mock).sponsors;
       var arg_part = "foo";
@@ -10520,11 +10932,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("sponsors"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("sponsors"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -10537,35 +10952,40 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["filter"].first, unittest.equals(arg_filter));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSponsorListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, filter: arg_filter, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SponsorListResponse response) {
+      res
+          .list(arg_part,
+              filter: arg_filter,
+              maxResults: arg_maxResults,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SponsorListResponse response) {
         checkSponsorListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SubscriptionsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.YoutubeApi(mock).subscriptions;
       var arg_id = "foo";
@@ -10574,11 +10994,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("subscriptions"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -10591,17 +11014,18 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -10610,7 +11034,6 @@
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.YoutubeApi(mock).subscriptions;
       var arg_request = buildSubscription();
@@ -10623,11 +11046,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("subscriptions"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -10640,28 +11066,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscription());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part).then(unittest.expectAsync1(((api.Subscription response) {
+      res
+          .insert(arg_request, arg_part)
+          .then(unittest.expectAsync1(((api.Subscription response) {
         checkSubscription(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.SubscriptionsResourceApi res = new api.YoutubeApi(mock).subscriptions;
       var arg_part = "foo";
@@ -10681,11 +11109,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13),
+            unittest.equals("subscriptions"));
         pathOffset += 13;
 
         var query = (req.url).query;
@@ -10698,45 +11129,65 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
-        unittest.expect(queryMap["forChannelId"].first, unittest.equals(arg_forChannelId));
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(
+            queryMap["forChannelId"].first, unittest.equals(arg_forChannelId));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["myRecentSubscribers"].first, unittest.equals("$arg_myRecentSubscribers"));
-        unittest.expect(queryMap["mySubscribers"].first, unittest.equals("$arg_mySubscribers"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(queryMap["myRecentSubscribers"].first,
+            unittest.equals("$arg_myRecentSubscribers"));
+        unittest.expect(queryMap["mySubscribers"].first,
+            unittest.equals("$arg_mySubscribers"));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
         unittest.expect(queryMap["order"].first, unittest.equals(arg_order));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSubscriptionListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, channelId: arg_channelId, forChannelId: arg_forChannelId, id: arg_id, maxResults: arg_maxResults, mine: arg_mine, myRecentSubscribers: arg_myRecentSubscribers, mySubscribers: arg_mySubscribers, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, order: arg_order, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SubscriptionListResponse response) {
+      res
+          .list(arg_part,
+              channelId: arg_channelId,
+              forChannelId: arg_forChannelId,
+              id: arg_id,
+              maxResults: arg_maxResults,
+              mine: arg_mine,
+              myRecentSubscribers: arg_myRecentSubscribers,
+              mySubscribers: arg_mySubscribers,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              order: arg_order,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.SubscriptionListResponse response) {
         checkSubscriptionListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-SuperChatEventsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.SuperChatEventsResourceApi res = new api.YoutubeApi(mock).superChatEvents;
+      api.SuperChatEventsResourceApi res =
+          new api.YoutubeApi(mock).superChatEvents;
       var arg_part = "foo";
       var arg_hl = "foo";
       var arg_maxResults = 42;
@@ -10746,11 +11197,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("superChatEvents"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("superChatEvents"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -10763,32 +11217,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildSuperChatEventListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.SuperChatEventListResponse response) {
+      res
+          .list(arg_part,
+              hl: arg_hl, maxResults: arg_maxResults, pageToken: arg_pageToken)
+          .then(
+              unittest.expectAsync1(((api.SuperChatEventListResponse response) {
         checkSuperChatEventListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ThumbnailsResourceApi", () {
     unittest.test("method--set", () {
       // TODO: Implement tests for media upload;
@@ -10803,11 +11262,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("thumbnails/set"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("thumbnails/set"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -10820,35 +11282,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["videoId"].first, unittest.equals(arg_videoId));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(
+            queryMap["videoId"].first, unittest.equals(arg_videoId));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildThumbnailSetResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.set(arg_videoId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.ThumbnailSetResponse response) {
+      res
+          .set(arg_videoId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.ThumbnailSetResponse response) {
         checkThumbnailSetResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VideoAbuseReportReasonsResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.VideoAbuseReportReasonsResourceApi res = new api.YoutubeApi(mock).videoAbuseReportReasons;
+      api.VideoAbuseReportReasonsResourceApi res =
+          new api.YoutubeApi(mock).videoAbuseReportReasons;
       var arg_part = "foo";
       var arg_hl = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -10856,11 +11321,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("videoAbuseReportReasons"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 23),
+            unittest.equals("videoAbuseReportReasons"));
         pathOffset += 23;
 
         var query = (req.url).query;
@@ -10873,35 +11341,36 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildVideoAbuseReportReasonListResponse());
+        var resp =
+            convert.JSON.encode(buildVideoAbuseReportReasonListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl).then(unittest.expectAsync1(((api.VideoAbuseReportReasonListResponse response) {
+      res.list(arg_part, hl: arg_hl).then(unittest
+          .expectAsync1(((api.VideoAbuseReportReasonListResponse response) {
         checkVideoAbuseReportReasonListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VideoCategoriesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.VideoCategoriesResourceApi res = new api.YoutubeApi(mock).videoCategories;
+      api.VideoCategoriesResourceApi res =
+          new api.YoutubeApi(mock).videoCategories;
       var arg_part = "foo";
       var arg_hl = "foo";
       var arg_id = "foo";
@@ -10911,11 +11380,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("videoCategories"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15),
+            unittest.equals("videoCategories"));
         pathOffset += 15;
 
         var query = (req.url).query;
@@ -10928,35 +11400,37 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["regionCode"].first, unittest.equals(arg_regionCode));
-
+        unittest.expect(
+            queryMap["regionCode"].first, unittest.equals(arg_regionCode));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVideoCategoryListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, hl: arg_hl, id: arg_id, regionCode: arg_regionCode).then(unittest.expectAsync1(((api.VideoCategoryListResponse response) {
+      res
+          .list(arg_part, hl: arg_hl, id: arg_id, regionCode: arg_regionCode)
+          .then(
+              unittest.expectAsync1(((api.VideoCategoryListResponse response) {
         checkVideoCategoryListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-VideosResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.VideosResourceApi res = new api.YoutubeApi(mock).videos;
       var arg_id = "foo";
@@ -10966,11 +11440,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("videos"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -10983,27 +11460,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--getRating", () {
-
       var mock = new HttpServerMock();
       api.VideosResourceApi res = new api.YoutubeApi(mock).videos;
       var arg_id = "foo";
@@ -11013,11 +11493,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("videos/getRating"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("videos/getRating"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -11030,23 +11513,27 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVideoGetRatingResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.getRating(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.VideoGetRatingResponse response) {
+      res
+          .getRating(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.VideoGetRatingResponse response) {
         checkVideoGetRatingResponse(response);
       })));
     });
@@ -11072,11 +11559,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("videos"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -11089,33 +11579,45 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["autoLevels"].first, unittest.equals("$arg_autoLevels"));
-        unittest.expect(queryMap["notifySubscribers"].first, unittest.equals("$arg_notifySubscribers"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first, unittest.equals(arg_onBehalfOfContentOwnerChannel));
-        unittest.expect(queryMap["stabilize"].first, unittest.equals("$arg_stabilize"));
-
+        unittest.expect(
+            queryMap["autoLevels"].first, unittest.equals("$arg_autoLevels"));
+        unittest.expect(queryMap["notifySubscribers"].first,
+            unittest.equals("$arg_notifySubscribers"));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["onBehalfOfContentOwnerChannel"].first,
+            unittest.equals(arg_onBehalfOfContentOwnerChannel));
+        unittest.expect(
+            queryMap["stabilize"].first, unittest.equals("$arg_stabilize"));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVideo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, arg_part, autoLevels: arg_autoLevels, notifySubscribers: arg_notifySubscribers, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel, stabilize: arg_stabilize).then(unittest.expectAsync1(((api.Video response) {
+      res
+          .insert(arg_request, arg_part,
+              autoLevels: arg_autoLevels,
+              notifySubscribers: arg_notifySubscribers,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
+              stabilize: arg_stabilize)
+          .then(unittest.expectAsync1(((api.Video response) {
         checkVideo(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.VideosResourceApi res = new api.YoutubeApi(mock).videos;
       var arg_part = "foo";
@@ -11136,11 +11638,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("videos"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -11153,10 +11658,12 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
@@ -11164,29 +11671,49 @@
         unittest.expect(queryMap["hl"].first, unittest.equals(arg_hl));
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["locale"].first, unittest.equals(arg_locale));
-        unittest.expect(core.int.parse(queryMap["maxHeight"].first), unittest.equals(arg_maxHeight));
-        unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(core.int.parse(queryMap["maxWidth"].first), unittest.equals(arg_maxWidth));
-        unittest.expect(queryMap["myRating"].first, unittest.equals(arg_myRating));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["regionCode"].first, unittest.equals(arg_regionCode));
-        unittest.expect(queryMap["videoCategoryId"].first, unittest.equals(arg_videoCategoryId));
-
+        unittest.expect(core.int.parse(queryMap["maxHeight"].first),
+            unittest.equals(arg_maxHeight));
+        unittest.expect(core.int.parse(queryMap["maxResults"].first),
+            unittest.equals(arg_maxResults));
+        unittest.expect(core.int.parse(queryMap["maxWidth"].first),
+            unittest.equals(arg_maxWidth));
+        unittest.expect(
+            queryMap["myRating"].first, unittest.equals(arg_myRating));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(
+            queryMap["regionCode"].first, unittest.equals(arg_regionCode));
+        unittest.expect(queryMap["videoCategoryId"].first,
+            unittest.equals(arg_videoCategoryId));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVideoListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_part, chart: arg_chart, hl: arg_hl, id: arg_id, locale: arg_locale, maxHeight: arg_maxHeight, maxResults: arg_maxResults, maxWidth: arg_maxWidth, myRating: arg_myRating, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, pageToken: arg_pageToken, regionCode: arg_regionCode, videoCategoryId: arg_videoCategoryId).then(unittest.expectAsync1(((api.VideoListResponse response) {
+      res
+          .list(arg_part,
+              chart: arg_chart,
+              hl: arg_hl,
+              id: arg_id,
+              locale: arg_locale,
+              maxHeight: arg_maxHeight,
+              maxResults: arg_maxResults,
+              maxWidth: arg_maxWidth,
+              myRating: arg_myRating,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              pageToken: arg_pageToken,
+              regionCode: arg_regionCode,
+              videoCategoryId: arg_videoCategoryId)
+          .then(unittest.expectAsync1(((api.VideoListResponse response) {
         checkVideoListResponse(response);
       })));
     });
 
     unittest.test("method--rate", () {
-
       var mock = new HttpServerMock();
       api.VideosResourceApi res = new api.YoutubeApi(mock).videos;
       var arg_id = "foo";
@@ -11196,11 +11723,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("videos/rate"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("videos/rate"));
         pathOffset += 11;
 
         var query = (req.url).query;
@@ -11213,18 +11743,19 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["rating"].first, unittest.equals(arg_rating));
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
@@ -11233,7 +11764,6 @@
     });
 
     unittest.test("method--reportAbuse", () {
-
       var mock = new HttpServerMock();
       api.VideosResourceApi res = new api.YoutubeApi(mock).videos;
       var arg_request = buildVideoAbuseReport();
@@ -11246,11 +11776,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("videos/reportAbuse"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 18),
+            unittest.equals("videos/reportAbuse"));
         pathOffset += 18;
 
         var query = (req.url).query;
@@ -11263,26 +11796,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.reportAbuse(arg_request, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .reportAbuse(arg_request,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.VideosResourceApi res = new api.YoutubeApi(mock).videos;
       var arg_request = buildVideo();
@@ -11296,11 +11833,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("videos"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -11313,30 +11853,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["part"].first, unittest.equals(arg_part));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildVideo());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_part, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Video response) {
+      res
+          .update(arg_request, arg_part,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Video response) {
         checkVideo(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-WatermarksResourceApi", () {
     unittest.test("method--set", () {
       // TODO: Implement tests for media upload;
@@ -11355,11 +11898,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("watermarks/set"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("watermarks/set"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -11372,27 +11918,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.set(arg_request, arg_channelId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .set(arg_request, arg_channelId,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--unset", () {
-
       var mock = new HttpServerMock();
       api.WatermarksResourceApi res = new api.YoutubeApi(mock).watermarks;
       var arg_channelId = "foo";
@@ -11402,11 +11953,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11),
+            unittest.equals("youtube/v3/"));
         pathOffset += 11;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("watermarks/unset"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 16),
+            unittest.equals("watermarks/unset"));
         pathOffset += 16;
 
         var query = (req.url).query;
@@ -11419,27 +11973,29 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["channelId"].first, unittest.equals(arg_channelId));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(
+            queryMap["channelId"].first, unittest.equals(arg_channelId));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.unset(arg_channelId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .unset(arg_channelId,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/youtubeanalytics/v1_test.dart b/generated/googleapis/test/youtubeanalytics/v1_test.dart
index 22f4490..fdf5cc3 100644
--- a/generated/googleapis/test/youtubeanalytics/v1_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.youtubeAnalytics.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/youtubeanalytics/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -87,7 +86,8 @@
 checkGroupSnippet(api.GroupSnippet o) {
   buildCounterGroupSnippet++;
   if (buildCounterGroupSnippet < 3) {
-    unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.publishedAt,
+        unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGroupSnippet--;
@@ -168,14 +168,14 @@
   buildCounterGroupItem--;
 }
 
-buildUnnamed271() {
+buildUnnamed270() {
   var o = new core.List<api.GroupItem>();
   o.add(buildGroupItem());
   o.add(buildGroupItem());
   return o;
 }
 
-checkUnnamed271(core.List<api.GroupItem> o) {
+checkUnnamed270(core.List<api.GroupItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroupItem(o[0]);
   checkGroupItem(o[1]);
@@ -187,7 +187,7 @@
   buildCounterGroupItemListResponse++;
   if (buildCounterGroupItemListResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed271();
+    o.items = buildUnnamed270();
     o.kind = "foo";
   }
   buildCounterGroupItemListResponse--;
@@ -198,20 +198,20 @@
   buildCounterGroupItemListResponse++;
   if (buildCounterGroupItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed271(o.items);
+    checkUnnamed270(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterGroupItemListResponse--;
 }
 
-buildUnnamed272() {
+buildUnnamed271() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed272(core.List<api.Group> o) {
+checkUnnamed271(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -223,7 +223,7 @@
   buildCounterGroupListResponse++;
   if (buildCounterGroupListResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed272();
+    o.items = buildUnnamed271();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -235,7 +235,7 @@
   buildCounterGroupListResponse++;
   if (buildCounterGroupListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed272(o.items);
+    checkUnnamed271(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -265,43 +265,59 @@
   buildCounterResultTableColumnHeaders--;
 }
 
-buildUnnamed273() {
+buildUnnamed272() {
   var o = new core.List<api.ResultTableColumnHeaders>();
   o.add(buildResultTableColumnHeaders());
   o.add(buildResultTableColumnHeaders());
   return o;
 }
 
-checkUnnamed273(core.List<api.ResultTableColumnHeaders> o) {
+checkUnnamed272(core.List<api.ResultTableColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultTableColumnHeaders(o[0]);
   checkResultTableColumnHeaders(o[1]);
 }
 
-buildUnnamed274() {
+buildUnnamed273() {
   var o = new core.List<core.Object>();
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
-  o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
+  o.add({
+    'list': [1, 2, 3],
+    'bool': true,
+    'string': 'foo'
+  });
   return o;
 }
 
-checkUnnamed274(core.List<core.Object> o) {
+checkUnnamed273(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
-  var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
+  var casted1 = (o[0]) as core.Map;
+  unittest.expect(casted1, unittest.hasLength(3));
+  unittest.expect(casted1["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted1["bool"], unittest.equals(true));
+  unittest.expect(casted1["string"], unittest.equals('foo'));
+  var casted2 = (o[1]) as core.Map;
+  unittest.expect(casted2, unittest.hasLength(3));
+  unittest.expect(casted2["list"], unittest.equals([1, 2, 3]));
+  unittest.expect(casted2["bool"], unittest.equals(true));
+  unittest.expect(casted2["string"], unittest.equals('foo'));
 }
 
-buildUnnamed275() {
+buildUnnamed274() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed274());
-  o.add(buildUnnamed274());
+  o.add(buildUnnamed273());
+  o.add(buildUnnamed273());
   return o;
 }
 
-checkUnnamed275(core.List<core.List<core.Object>> o) {
+checkUnnamed274(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed274(o[0]);
-  checkUnnamed274(o[1]);
+  checkUnnamed273(o[0]);
+  checkUnnamed273(o[1]);
 }
 
 core.int buildCounterResultTable = 0;
@@ -309,9 +325,9 @@
   var o = new api.ResultTable();
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    o.columnHeaders = buildUnnamed273();
+    o.columnHeaders = buildUnnamed272();
     o.kind = "foo";
-    o.rows = buildUnnamed275();
+    o.rows = buildUnnamed274();
   }
   buildCounterResultTable--;
   return o;
@@ -320,14 +336,13 @@
 checkResultTable(api.ResultTable o) {
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    checkUnnamed273(o.columnHeaders);
+    checkUnnamed272(o.columnHeaders);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed275(o.rows);
+    checkUnnamed274(o.rows);
   }
   buildCounterResultTable--;
 }
 
-
 main() {
   unittest.group("obj-schema-GroupContentDetails", () {
     unittest.test("to-json--from-json", () {
@@ -337,7 +352,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupSnippet", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupSnippet();
@@ -346,7 +360,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Group", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroup();
@@ -355,7 +368,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupItemResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupItemResource();
@@ -364,7 +376,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupItem", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupItem();
@@ -373,7 +384,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupItemListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupItemListResponse();
@@ -382,7 +392,6 @@
     });
   });
 
-
   unittest.group("obj-schema-GroupListResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildGroupListResponse();
@@ -391,7 +400,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultTableColumnHeaders", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultTableColumnHeaders();
@@ -400,7 +408,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ResultTable", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultTable();
@@ -409,12 +416,11 @@
     });
   });
 
-
   unittest.group("resource-GroupItemsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
-      api.GroupItemsResourceApi res = new api.YoutubeAnalyticsApi(mock).groupItems;
+      api.GroupItemsResourceApi res =
+          new api.YoutubeAnalyticsApi(mock).groupItems;
       var arg_id = "foo";
       var arg_onBehalfOfContentOwner = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -422,11 +428,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("groupItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("groupItems"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -439,29 +448,33 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
-      api.GroupItemsResourceApi res = new api.YoutubeAnalyticsApi(mock).groupItems;
+      api.GroupItemsResourceApi res =
+          new api.YoutubeAnalyticsApi(mock).groupItems;
       var arg_request = buildGroupItem();
       var arg_onBehalfOfContentOwner = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -472,11 +485,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("groupItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("groupItems"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -489,30 +505,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroupItem());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.GroupItem response) {
+      res
+          .insert(arg_request,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.GroupItem response) {
         checkGroupItem(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.GroupItemsResourceApi res = new api.YoutubeAnalyticsApi(mock).groupItems;
+      api.GroupItemsResourceApi res =
+          new api.YoutubeAnalyticsApi(mock).groupItems;
       var arg_groupId = "foo";
       var arg_onBehalfOfContentOwner = "foo";
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
@@ -520,11 +541,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("groupItems"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10),
+            unittest.equals("groupItems"));
         pathOffset += 10;
 
         var query = (req.url).query;
@@ -537,33 +561,35 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["groupId"].first, unittest.equals(arg_groupId));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(
+            queryMap["groupId"].first, unittest.equals(arg_groupId));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroupItemListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_groupId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.GroupItemListResponse response) {
+      res
+          .list(arg_groupId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.GroupItemListResponse response) {
         checkGroupItemListResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-GroupsResourceApi", () {
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.YoutubeAnalyticsApi(mock).groups;
       var arg_id = "foo";
@@ -573,11 +599,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("groups"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -590,27 +619,30 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = "";
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1((_) {}));
+      res
+          .delete(arg_id, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1((_) {}));
     });
 
     unittest.test("method--insert", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.YoutubeAnalyticsApi(mock).groups;
       var arg_request = buildGroup();
@@ -623,11 +655,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("groups"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -640,28 +675,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroup());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Group response) {
+      res
+          .insert(arg_request,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Group response) {
         checkGroup(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.YoutubeAnalyticsApi(mock).groups;
       var arg_id = "foo";
@@ -673,11 +712,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("groups"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -690,31 +732,39 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["id"].first, unittest.equals(arg_id));
         unittest.expect(queryMap["mine"].first, unittest.equals("$arg_mine"));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroupListResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(id: arg_id, mine: arg_mine, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, pageToken: arg_pageToken).then(unittest.expectAsync1(((api.GroupListResponse response) {
+      res
+          .list(
+              id: arg_id,
+              mine: arg_mine,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              pageToken: arg_pageToken)
+          .then(unittest.expectAsync1(((api.GroupListResponse response) {
         checkGroupListResponse(response);
       })));
     });
 
     unittest.test("method--update", () {
-
       var mock = new HttpServerMock();
       api.GroupsResourceApi res = new api.YoutubeAnalyticsApi(mock).groups;
       var arg_request = buildGroup();
@@ -727,11 +777,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6),
+            unittest.equals("groups"));
         pathOffset += 6;
 
         var query = (req.url).query;
@@ -744,32 +797,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildGroup());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Group response) {
+      res
+          .update(arg_request,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Group response) {
         checkGroup(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReportsResourceApi", () {
     unittest.test("method--query", () {
-
       var mock = new HttpServerMock();
       api.ReportsResourceApi res = new api.YoutubeAnalyticsApi(mock).reports;
       var arg_ids = "foo";
@@ -788,11 +843,14 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 21),
+            unittest.equals("youtube/analytics/v1/"));
         pathOffset += 21;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("reports"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -805,38 +863,54 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
         unittest.expect(queryMap["ids"].first, unittest.equals(arg_ids));
-        unittest.expect(queryMap["start-date"].first, unittest.equals(arg_start_date));
-        unittest.expect(queryMap["end-date"].first, unittest.equals(arg_end_date));
-        unittest.expect(queryMap["metrics"].first, unittest.equals(arg_metrics));
-        unittest.expect(queryMap["currency"].first, unittest.equals(arg_currency));
-        unittest.expect(queryMap["dimensions"].first, unittest.equals(arg_dimensions));
-        unittest.expect(queryMap["filters"].first, unittest.equals(arg_filters));
-        unittest.expect(queryMap["include-historical-channel-data"].first, unittest.equals("$arg_include_historical_channel_data"));
-        unittest.expect(core.int.parse(queryMap["max-results"].first), unittest.equals(arg_max_results));
+        unittest.expect(
+            queryMap["start-date"].first, unittest.equals(arg_start_date));
+        unittest.expect(
+            queryMap["end-date"].first, unittest.equals(arg_end_date));
+        unittest.expect(
+            queryMap["metrics"].first, unittest.equals(arg_metrics));
+        unittest.expect(
+            queryMap["currency"].first, unittest.equals(arg_currency));
+        unittest.expect(
+            queryMap["dimensions"].first, unittest.equals(arg_dimensions));
+        unittest.expect(
+            queryMap["filters"].first, unittest.equals(arg_filters));
+        unittest.expect(queryMap["include-historical-channel-data"].first,
+            unittest.equals("$arg_include_historical_channel_data"));
+        unittest.expect(core.int.parse(queryMap["max-results"].first),
+            unittest.equals(arg_max_results));
         unittest.expect(queryMap["sort"].first, unittest.equals(arg_sort));
-        unittest.expect(core.int.parse(queryMap["start-index"].first), unittest.equals(arg_start_index));
-
+        unittest.expect(core.int.parse(queryMap["start-index"].first),
+            unittest.equals(arg_start_index));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildResultTable());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.query(arg_ids, arg_start_date, arg_end_date, arg_metrics, currency: arg_currency, dimensions: arg_dimensions, filters: arg_filters, include_historical_channel_data: arg_include_historical_channel_data, max_results: arg_max_results, sort: arg_sort, start_index: arg_start_index).then(unittest.expectAsync1(((api.ResultTable response) {
+      res
+          .query(arg_ids, arg_start_date, arg_end_date, arg_metrics,
+              currency: arg_currency,
+              dimensions: arg_dimensions,
+              filters: arg_filters,
+              include_historical_channel_data:
+                  arg_include_historical_channel_data,
+              max_results: arg_max_results,
+              sort: arg_sort,
+              start_index: arg_start_index)
+          .then(unittest.expectAsync1(((api.ResultTable response) {
         checkResultTable(response);
       })));
     });
-
   });
-
-
 }
-
diff --git a/generated/googleapis/test/youtubereporting/v1_test.dart b/generated/googleapis/test/youtubereporting/v1_test.dart
index 1648c4c..e33aa85 100644
--- a/generated/googleapis/test/youtubereporting/v1_test.dart
+++ b/generated/googleapis/test/youtubereporting/v1_test.dart
@@ -1,12 +1,10 @@
 library googleapis.youtubereporting.v1.test;
 
 import "dart:core" as core;
-import "dart:collection" as collection;
 import "dart:async" as async;
 import "dart:convert" as convert;
 
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart' as http_testing;
 import 'package:test/test.dart' as unittest;
 
 import 'package:googleapis/youtubereporting/v1.dart' as api;
@@ -22,7 +20,8 @@
 
   async.Future<http.StreamedResponse> send(http.BaseRequest request) {
     if (_expectJson) {
-      return request.finalize()
+      return request
+          .finalize()
           .transform(convert.UTF8.decoder)
           .join('')
           .then((core.String jsonString) {
@@ -45,8 +44,8 @@
   }
 }
 
-http.StreamedResponse stringResponse(
-    core.int status, core.Map<core.String, core.String> headers, core.String body) {
+http.StreamedResponse stringResponse(core.int status,
+    core.Map<core.String, core.String> headers, core.String body) {
   var stream = new async.Stream.fromIterable([convert.UTF8.encode(body)]);
   return new http.StreamedResponse(stream, status, headers: headers);
 }
@@ -55,16 +54,14 @@
 buildEmpty() {
   var o = new api.Empty();
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
   return o;
 }
 
 checkEmpty(api.Empty o) {
   buildCounterEmpty++;
-  if (buildCounterEmpty < 3) {
-  }
+  if (buildCounterEmpty < 3) {}
   buildCounterEmpty--;
 }
 
@@ -97,14 +94,14 @@
   buildCounterJob--;
 }
 
-buildUnnamed1078() {
+buildUnnamed1081() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1078(core.List<api.Job> o) {
+checkUnnamed1081(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -115,7 +112,7 @@
   var o = new api.ListJobsResponse();
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    o.jobs = buildUnnamed1078();
+    o.jobs = buildUnnamed1081();
     o.nextPageToken = "foo";
   }
   buildCounterListJobsResponse--;
@@ -125,20 +122,20 @@
 checkListJobsResponse(api.ListJobsResponse o) {
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
-    checkUnnamed1078(o.jobs);
+    checkUnnamed1081(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListJobsResponse--;
 }
 
-buildUnnamed1079() {
+buildUnnamed1082() {
   var o = new core.List<api.ReportType>();
   o.add(buildReportType());
   o.add(buildReportType());
   return o;
 }
 
-checkUnnamed1079(core.List<api.ReportType> o) {
+checkUnnamed1082(core.List<api.ReportType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportType(o[0]);
   checkReportType(o[1]);
@@ -150,7 +147,7 @@
   buildCounterListReportTypesResponse++;
   if (buildCounterListReportTypesResponse < 3) {
     o.nextPageToken = "foo";
-    o.reportTypes = buildUnnamed1079();
+    o.reportTypes = buildUnnamed1082();
   }
   buildCounterListReportTypesResponse--;
   return o;
@@ -160,19 +157,19 @@
   buildCounterListReportTypesResponse++;
   if (buildCounterListReportTypesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1079(o.reportTypes);
+    checkUnnamed1082(o.reportTypes);
   }
   buildCounterListReportTypesResponse--;
 }
 
-buildUnnamed1080() {
+buildUnnamed1083() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed1080(core.List<api.Report> o) {
+checkUnnamed1083(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -184,7 +181,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.nextPageToken = "foo";
-    o.reports = buildUnnamed1080();
+    o.reports = buildUnnamed1083();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -194,7 +191,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1080(o.reports);
+    checkUnnamed1083(o.reports);
   }
   buildCounterListReportsResponse--;
 }
@@ -274,7 +271,6 @@
   buildCounterReportType--;
 }
 
-
 main() {
   unittest.group("obj-schema-Empty", () {
     unittest.test("to-json--from-json", () {
@@ -284,7 +280,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Job", () {
     unittest.test("to-json--from-json", () {
       var o = buildJob();
@@ -293,7 +288,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListJobsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListJobsResponse();
@@ -302,7 +296,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListReportTypesResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListReportTypesResponse();
@@ -311,7 +304,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ListReportsResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildListReportsResponse();
@@ -320,7 +312,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Media", () {
     unittest.test("to-json--from-json", () {
       var o = buildMedia();
@@ -329,7 +320,6 @@
     });
   });
 
-
   unittest.group("obj-schema-Report", () {
     unittest.test("to-json--from-json", () {
       var o = buildReport();
@@ -338,7 +328,6 @@
     });
   });
 
-
   unittest.group("obj-schema-ReportType", () {
     unittest.test("to-json--from-json", () {
       var o = buildReportType();
@@ -347,10 +336,8 @@
     });
   });
 
-
   unittest.group("resource-JobsResourceApi", () {
     unittest.test("method--create", () {
-
       var mock = new HttpServerMock();
       api.JobsResourceApi res = new api.YoutubereportingApi(mock).jobs;
       var arg_request = buildJob();
@@ -363,9 +350,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("v1/jobs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("v1/jobs"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -378,28 +367,32 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Job response) {
+      res
+          .create(arg_request,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Job response) {
         checkJob(response);
       })));
     });
 
     unittest.test("method--delete", () {
-
       var mock = new HttpServerMock();
       api.JobsResourceApi res = new api.YoutubereportingApi(mock).jobs;
       var arg_jobId = "foo";
@@ -409,9 +402,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/jobs/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -427,28 +422,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildEmpty());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_jobId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Empty response) {
+      res
+          .delete(arg_jobId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Empty response) {
         checkEmpty(response);
       })));
     });
 
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
       api.JobsResourceApi res = new api.YoutubereportingApi(mock).jobs;
       var arg_jobId = "foo";
@@ -458,9 +456,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/jobs/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -476,28 +476,31 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildJob());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_jobId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Job response) {
+      res
+          .get(arg_jobId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Job response) {
         checkJob(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
       api.JobsResourceApi res = new api.YoutubereportingApi(mock).jobs;
       var arg_includeSystemManaged = true;
@@ -509,9 +512,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("v1/jobs"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7),
+            unittest.equals("v1/jobs"));
         pathOffset += 7;
 
         var query = (req.url).query;
@@ -524,37 +529,46 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["includeSystemManaged"].first, unittest.equals("$arg_includeSystemManaged"));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["includeSystemManaged"].first,
+            unittest.equals("$arg_includeSystemManaged"));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListJobsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(includeSystemManaged: arg_includeSystemManaged, pageToken: arg_pageToken, pageSize: arg_pageSize, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.ListJobsResponse response) {
+      res
+          .list(
+              includeSystemManaged: arg_includeSystemManaged,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.ListJobsResponse response) {
         checkListJobsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-JobsReportsResourceApi", () {
     unittest.test("method--get", () {
-
       var mock = new HttpServerMock();
-      api.JobsReportsResourceApi res = new api.YoutubereportingApi(mock).jobs.reports;
+      api.JobsReportsResourceApi res =
+          new api.YoutubereportingApi(mock).jobs.reports;
       var arg_jobId = "foo";
       var arg_reportId = "foo";
       var arg_onBehalfOfContentOwner = "foo";
@@ -563,16 +577,20 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/jobs/"));
         pathOffset += 8;
         index = path.indexOf("/reports/", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_jobId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/reports/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("/reports/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
@@ -588,52 +606,61 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildReport());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.get(arg_jobId, arg_reportId, onBehalfOfContentOwner: arg_onBehalfOfContentOwner).then(unittest.expectAsync1(((api.Report response) {
+      res
+          .get(arg_jobId, arg_reportId,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner)
+          .then(unittest.expectAsync1(((api.Report response) {
         checkReport(response);
       })));
     });
 
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.JobsReportsResourceApi res = new api.YoutubereportingApi(mock).jobs.reports;
+      api.JobsReportsResourceApi res =
+          new api.YoutubereportingApi(mock).jobs.reports;
       var arg_jobId = "foo";
-      var arg_createdAfter = "foo";
-      var arg_pageToken = "foo";
-      var arg_startTimeAtOrAfter = "foo";
-      var arg_pageSize = 42;
       var arg_onBehalfOfContentOwner = "foo";
       var arg_startTimeBefore = "foo";
+      var arg_createdAfter = "foo";
+      var arg_startTimeAtOrAfter = "foo";
+      var arg_pageToken = "foo";
+      var arg_pageSize = 42;
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("v1/jobs/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("v1/jobs/"));
         pathOffset += 8;
         index = path.indexOf("/reports", pathOffset);
         unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        subPart =
+            core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
         pathOffset = index;
         unittest.expect(subPart, unittest.equals("$arg_jobId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/reports"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8),
+            unittest.equals("/reports"));
         pathOffset += 8;
 
         var query = (req.url).query;
@@ -646,34 +673,47 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["createdAfter"].first, unittest.equals(arg_createdAfter));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(queryMap["startTimeAtOrAfter"].first, unittest.equals(arg_startTimeAtOrAfter));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["startTimeBefore"].first, unittest.equals(arg_startTimeBefore));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["startTimeBefore"].first,
+            unittest.equals(arg_startTimeBefore));
+        unittest.expect(
+            queryMap["createdAfter"].first, unittest.equals(arg_createdAfter));
+        unittest.expect(queryMap["startTimeAtOrAfter"].first,
+            unittest.equals(arg_startTimeAtOrAfter));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListReportsResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(arg_jobId, createdAfter: arg_createdAfter, pageToken: arg_pageToken, startTimeAtOrAfter: arg_startTimeAtOrAfter, pageSize: arg_pageSize, onBehalfOfContentOwner: arg_onBehalfOfContentOwner, startTimeBefore: arg_startTimeBefore).then(unittest.expectAsync1(((api.ListReportsResponse response) {
+      res
+          .list(arg_jobId,
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              startTimeBefore: arg_startTimeBefore,
+              createdAfter: arg_createdAfter,
+              startTimeAtOrAfter: arg_startTimeAtOrAfter,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListReportsResponse response) {
         checkListReportsResponse(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-MediaResourceApi", () {
     unittest.test("method--download", () {
       // TODO: Implement tests for media upload;
@@ -687,9 +727,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("v1/media/"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9),
+            unittest.equals("v1/media/"));
         pathOffset += 9;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
 
@@ -703,33 +745,34 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
 
-
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildMedia());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.download(arg_resourceName).then(unittest.expectAsync1(((api.Media response) {
+      res
+          .download(arg_resourceName)
+          .then(unittest.expectAsync1(((api.Media response) {
         checkMedia(response);
       })));
     });
-
   });
 
-
   unittest.group("resource-ReportTypesResourceApi", () {
     unittest.test("method--list", () {
-
       var mock = new HttpServerMock();
-      api.ReportTypesResourceApi res = new api.YoutubereportingApi(mock).reportTypes;
+      api.ReportTypesResourceApi res =
+          new api.YoutubereportingApi(mock).reportTypes;
       var arg_onBehalfOfContentOwner = "foo";
       var arg_includeSystemManaged = true;
       var arg_pageToken = "foo";
@@ -739,9 +782,11 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("v1/reportTypes"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14),
+            unittest.equals("v1/reportTypes"));
         pathOffset += 14;
 
         var query = (req.url).query;
@@ -754,31 +799,38 @@
           if (n == null) return null;
           throw new core.ArgumentError("Invalid boolean: $n");
         }
+
         if (query.length > 0) {
           for (var part in query.split("&")) {
             var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]),
+                core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
-        unittest.expect(queryMap["onBehalfOfContentOwner"].first, unittest.equals(arg_onBehalfOfContentOwner));
-        unittest.expect(queryMap["includeSystemManaged"].first, unittest.equals("$arg_includeSystemManaged"));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
-
+        unittest.expect(queryMap["onBehalfOfContentOwner"].first,
+            unittest.equals(arg_onBehalfOfContentOwner));
+        unittest.expect(queryMap["includeSystemManaged"].first,
+            unittest.equals("$arg_includeSystemManaged"));
+        unittest.expect(
+            queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first),
+            unittest.equals(arg_pageSize));
 
         var h = {
-          "content-type" : "application/json; charset=utf-8",
+          "content-type": "application/json; charset=utf-8",
         };
         var resp = convert.JSON.encode(buildListReportTypesResponse());
         return new async.Future.value(stringResponse(200, h, resp));
       }), true);
-      res.list(onBehalfOfContentOwner: arg_onBehalfOfContentOwner, includeSystemManaged: arg_includeSystemManaged, pageToken: arg_pageToken, pageSize: arg_pageSize).then(unittest.expectAsync1(((api.ListReportTypesResponse response) {
+      res
+          .list(
+              onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
+              includeSystemManaged: arg_includeSystemManaged,
+              pageToken: arg_pageToken,
+              pageSize: arg_pageSize)
+          .then(unittest.expectAsync1(((api.ListReportTypesResponse response) {
         checkListReportTypesResponse(response);
       })));
     });
-
   });
-
-
 }
-
